2013-06-04 4 views
5

私は、オブジェクトまたはnullを返す可能性のある関数にboostオプションを使用しようとしていました。ここまで私がこれまで持っていたことがあります。この問題を解決する方法についてのご意見をいただければ幸いです。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; 
} 

更新:

は、これは私の新しいコードであると私はあなたの関数は次のようになります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; 
} 

あなたは01にキャストしてチェックすることができます:

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機能)初期化子リストのサポートが必要なことに注意してください。次に、あなただけの

value = 200; 
を書くことができ

Myclass(int a_): a(a_) 
{ 

} 

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

または引数としてintMyclassのコンストラクタを提供します。あなたのコンパイラがそれをサポートしていない場合、あなたはこのようにそれを使用することができます

+0

私は 'value = {200}'と混乱します。それは 'value-> a = 200'になりませんか? – MistyD

+0

@MistyD、編集を見てください。 – soon

+0

編集していただきありがとうございます。しかし、 'value = {200};では'エラーC2143:構文エラー:ありません 'のビルド中にコンパイルエラーが発生しました' before '{' ' – MistyD

関連する問題