从类方法返回可选

问题描述

我在一个类中有一个可选成员,我想通过一种方法按值返回。 示例代码:

#include <stdio.h>
#include <optional>
#include <iostream>
using namespace std;

class bar {
public:
    int a;

    bar(const bar &obj) {
        a = obj.a;
    }
};

class foo {
public:
    void init(){
        abc->a = 100;
    }

    optional<bar> get() {
        return abc;
    }
    
    optional<bar> abc;
};

int main()
{
    foo temp;
    temp.init();
    auto copied = temp.get();
    cout << "Expected value is 100,got: " << copied->a;
    return 0;
}

代码输出一些垃圾值。

我该如何实现?


据我所知,optional为底层类型(不只是引用)存储了完全分配的内存,并且在返回可选变量的同时,底层类型的copy构造函数也应加入其中,它应按原样复制内存返回新的可选值。

解决方法

您需要使用optional的构造函数来确保它包含一个对象:(假设bar的冗余副本构造函数(阻止了其构造)已删除)

foo()
    : abc{bar{100}}
{
}

,或者在创建optional之后:

void init(){
    abc = bar{100};
}

否则,optional保持为空状态,而在空的->上调用optional则得到undefined behavior。当源为空时,optional的复制构造函数不会复制构造包含的对象。

,

std::optional就像一个智能指针,它默认为“ null”值,因此访问其成员将是不确定的行为。您需要在使用前对其进行初始化:

void init(){
  abc = bar();
  abc->a = 100;
}

请注意,bar只能通过复制构造函数进行构造,因此您需要添加默认构造函数或带有int参数的构造函数,或删除不必要的复制构造函数。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...