У меня есть необязательный член в классе, который я хочу вернуть по значению через метод. Образец кода:
#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;
}
Код выводит какое-то мусорное значение.
Как я могу этого добиться?
Насколько я понимаю, необязательный хранит полностью выделенную память для базового типа (а не только ссылку), и при возврате необязательной переменной должен сработать конструктор копирования базового типа, который должен скопировать память как есть в новый возвращается необязательное значение.
std::optional
создает необязательный пустой (не содержит значения), поэтому ваш конструкторfoo
abc->a = 100;
вызывает неопределенное поведение (поскольку у вас нет объекта для доступа) - person UnholySheep   schedule 10.09.2020member_.value() = newValue
? - person Nishant   schedule 10.09.2020init
и вызвать APIinit
в основной функции. Теперь базовый тип должен быть правильно инициализирован для копирования, верно? - person Nishant   schedule 10.09.2020value()
выдает исключение, если необязательный параметр не содержит значения. Вы либо создаете необязательный параметр со значением (используя соответствующую перегрузку конструктора), либо используете перегруженныйoperator=
, либо функцию-членemplace
(если вы хотите создать объект на месте) - person UnholySheep   schedule 10.09.2020bar
не может создавать экземпляры как есть, поскольку единственный конструктор, который он предоставляет, является конструктором копирования. Вы должны добавить хотя бы конструктор по умолчанию или конструктор преобразования изint
. - person Daniel Langr   schedule 10.09.2020