2013-06-04 4 views
5

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

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; 
} 

Update:

Это мой новый код, и я получаю ошибку компиляции в 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; 
} 

ответ

8

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

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; 

Isnt это будет ценностно> а = 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; 
+0

Я путаюсь с 'value = {200}' Не будет ли это 'value-> a = 200'? – MistyD

+0

@MistyD, посмотрите на редактирование. – soon

+0

Спасибо за редактирование.Но с 'value = {200};' Я получаю ошибку компиляции при построении 'ошибка C2143: синтаксическая ошибка: отсутствует ';' before '{' ' – MistyD