2010-11-23 13 views
0

私はBoostライブラリからスマートポインタを使用します。私はこのオブジェクトがあると:クラスBでC++:boost:値渡しパラメータ

boost::shared_ptr<A> a(new A); 

a->fileName = "/temp"; 

を、私は:

bool open(A *a); 

private: boost::shared_ptr<A> myA; 

をその後IがオブジェクトBを宣言する:

boost::shared_ptr<B> b(new B()); 

b->open(a.get()); 

bool B::open(A *a) 
{ 
    *B::myA = *a; 
} 

上記のデモンストレーションは値渡しについてのものです。 ter。コンパイルは結構ですが、私はそれを実行すると、それはこのエラーを与えた:

/usr/local/include/boost/smart_ptr/shared_ptr.hpp:412: typename boost::detail::shared_ptr_traits<T>::reference boost::shared_ptr<T>::operator*() const [with T = NameSpaceABC::Common::A]: Assertion `px != 0' failed. 
Aborted 

そして、上記と同じ質問に対して、私が持っているために何を変更する必要があります参照パラメータで渡しますか?私がC#とJavaプログラマであるので、私はちょうどクイックプロジェクトのためにC++に切り替えました。私はポインタとブーストスマートポインタを使用することに精通していない。

ご協力いただきありがとうございます。ご協力いただきありがとうございます。

+1

'VImageInputStream :: open'をデバッグして、' a 'のどちらかの値が0かどうかを確認しましたか?ブーストアサーションは非常に明確です:あなたは空の 'shared_ptr'を逆参照しています。 – icecrime

+0

こんにちは、私は以下のSpace_C0wb0yから答えをチェックしました。それは正常に動作していますが、私はそれが値渡しパラメータまたは参照渡しパラメータであるかどうか不明ですか?スマートポインタのデストラクタで 'delete'を書く方法。事前に感謝します – olidev

+0

スマートポインタの「スマートな」部分は、もはや 'delete'を書く必要がないということです。彼らはあなたのためにそれをやるでしょう。最後の 'shared_ptr 'がなくなると、Aオブジェクトが削除されます。 – MSalters

答えて

2

オブジェクトに対してスマートポインタポインタを使用する場合は、そのオブジェクトに対して常に使用する必要があります。あなたのケースでは、openは次のようになります。

bool B::open(boost::shared_ptr<A> a) { 
    myA = a; 
} 

この方法であなたはopenに渡されたオブジェクトの参照セマンティクスを持っているでしょう。コード例では、参照ではなくオブジェクトを割り当てようとしました。その場合、あなたはmyAはすでに(好ましくはコンストラクタで)タイプAの有効なオブジェクトが含まれていることを確認する必要があります。

B::B() : myA(boost::make_shared<A>()) {} 

そしてあなたは、このようなあなたのopen方法書くことができます。

bool B::open(const A & a) { 
    *myA = a; 
} 

をまたshared_ptrの仕組みを理解するためにthisと読んでください。

+0

ああ。私は参照してください、これは値渡しのパラメータ、右ですか?もしそうなら、参照渡しパラメータはどうですか?前もって感謝します! – olidev

+0

@冗談: 'shared_ptr' *は参照です。そしてあなたは値で参照を渡します。 'shared_ptr'は、常に参照カウントが機能するので、値によって渡されるべきです。 –

+0

私は 'shared_ptr'を最初のケースで値渡しする必要はないと思います。最終的に同じオブジェクトに2つのポインタがあることになります。一時的に3番目のポインタを持つ必要はありません。 – visitor

0

オブジェクトを指していないshared_ptrを間接参照しています。

2つのシナリオが考えられます。

1)メインとBのAオブジェクトを共有したい場合は、shared_ptrを開いて渡す必要があります。

bool B::open(const shared_ptr<A>& a) 
{ 
    myA = a; 
} 

//called with 
b->open(a); 

2)Bに値のコピーを作成させます。それから、オブジェクトを渡すのが理にかなっているかもしれません。

bool B::open(const A& a) 
{ 
    myA.reset(new A(a)); 
} 

//called with 
b->open(*a); 

それともmyAはすでにオブジェクトを指している場合、あなたは新しいものを割り当てる必要はありません。

bool B::open(const A& a) 
{ 
    if (myA) 
     *myA = a; 
    else 
     myA.reset(new A(a)); 
} 
関連する問題