2011-12-24 8 views
2

私はshared_ptrsを初めて使い、 "オプションの"ポインタ引数を扱う正しい方法を悩ましています。つまり、メソッドにポインタ引数を渡すのが最善の方法であり、そのいずれかが指定された呼び出しでNULLになる可能性があります。ここでは生のポインタを使用した簡単な例です:これは、オプションの/ NULL shared_ptrパラメータを渡すためのよいイディオムですか?

class Obj { 
    SomeType *ptrA; 
    SomeType *ptrB; 
    ... 
    void method(SomeType* a, SomeType* b) { 
     ptrA = a; 
     ptrB = b; 
    } 
} 

は今shared_ptrsに切り替える:発信者がNULLを渡すことができますし、簡単にNULLのデフォルト値と引数を宣言することができるように

class Obj { 
    shared_ptr<SomeType> ptrA; 
    shared_ptr<SomeType> ptrB; 

    // Option 1: pointers to shared pointers: 

    void method1(shared_ptr<SomeType>* a, shared_ptr<SomeType>* b) { 
     if (a) ptrA = *a; 
     else ptrA.reset(); 
     // repeat for b 
    } 

    // Option 2: pass empty shared_ptrs as analog for NULL 

    void method2(shared_ptr<SomeType> a, shared_ptr<SomeType> b) { 
     ptrA = a; 
     ptrB = b; 
    } 
} 

method1にはshared_ptrsへのポインタを取ります。しかし、ロジックがちょっと面倒になり、shared_ptrsへのポインタを使うのは間違っているようです。

method2では、呼び出し側が任意の "NULL"引数に対して一時的な空のshared_ptrsを作成する必要があります。それは最高で厄介で不明瞭です。

方法1が最善の方法ですか?より良い方法がありますか?私はここでボートを完全に逃したのですか?

+1

私はあなたの議論に従うか分からない。一時的な空の 'shared_ptr'を渡すのは面倒で曖昧です。一方、オブジェクトの所有権を共有することを依頼することとは全く別の操作で、ポインタの1つを解放するようObjに依頼していませんか?もしそうであれば、なぜこれらの異なる操作に異なる機能を持たせないと、呼び出し側はどちらの場合でも完全に単純で明確な関数呼び出しを使用できますか? –

+2

この目的のためにBoost.optionalを見てください。 –

+0

@CharlesBaileyメソッド(shared_ptr ()、shared_ptr ())のようなものは、メソッド(NULL、NULL)よりも、一目でわかりにくいと思われます。私が物事を理解すれば、あなたは本当にそれをさらに悪化させる明示的な一時的なものを使うべきです(私は思っています)。あなたは正しいかどうかはっきりしているが、いくつかのケースでは、すべての引数を個別のセッター/ゲッターを持つのではなく単一のメソッドに渡す方が適切な場合があります。 – dschultz

答えて

5

null共有ポインタを渡すことには何も問題ありません。実際、null共有ポインタは実際のNull Objectです。つまり、そのような用途に合わせて設計されています。

関連する問題