неудачная попытка использовать boost :: необязательный

Я пытался использовать опцию boost необязательно для функции, которая могла бы вернуть объект или ноль, и я не могу понять это. Вот что у меня так далеко. Любые предложения о том, как решить эту проблему, будут оценены.

class Myclass
{
public:
int a;
};

boost::optional<Myclass> func(int a)  //This could either return MyClass or a null
{
boost::optional<Myclass> value;
if(a==0)
{
//return an object
boost::optional<Myclass> value;
value->a = 200;

}
else
{
return NULL;
}

return value;
}

int main(int argc, char **argv)
{
boost::optional<Myclass> v = func(0);
//How do I check if its a NULL or an object

return 0;
}

Обновить:

Это мой новый код, и я получаю ошибку компилятора в value = {200};

class Myclass
{
public:
int a;
};

boost::optional<Myclass> func(int a)
{
boost::optional<Myclass> value;
if(a == 0)
value = {200};

return value;
}

int main(int argc, char **argv)
{
boost::optional<Myclass> v = func(0);if(v)
std::cout << v -> a << std::endl;
else
std::cout << "Uninitilized" << std::endl;
std::cin.get();

return 0;
}

5

Решение

Ваша функция должна выглядеть следующим образом:

boost::optional<Myclass> func(int a)
{
boost::optional<Myclass> value;
if(a == 0)
value = {200};

return value;
}

И вы можете проверить это, приведя к bool:

boost::optional<Myclass> v = func(42);
if(v)
std::cout << v -> a << std::endl;
else
std::cout << "Uninitilized" << std::endl;

Не будет ли это значение-> a = 200

Нет, это не так. От Boost.Optional.Docs:

T const* optional<T (not a ref)>::operator ->() const ;

T* optional<T (not a ref)>::operator ->() ;
  • Требования: * это инициализировано.
  • Возвращает: указатель на содержащееся значение.
  • Броски: ничего.
  • Примечания. Требование подтверждается с помощью BOOST_ASSERT ().

И в operator-> определение:

pointer_const_type operator->() const
{
BOOST_ASSERT(this->is_initialized());
return this->get_ptr_impl();
}

Если объект не инициализирован, утверждение не будет выполнено. Когда мы пишем

value = {200};

Мы инициализируем значение с Myclass{200},


Обратите внимание, что value = {200} требуется поддержка списков инициализаторов (функция C ++ 11). Если ваш компилятор не поддерживает его, вы можете использовать его так:

Myclass c;
c.a = 200;
value = c;

Или предоставить конструктор для Myclass с int в качестве аргумента:

Myclass(int a_): a(a_)
{

}

Тогда вы могли бы просто написать

value = 200;
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]