2009-05-20 18 views
1

オブジェクト(B)へのポインタを返すライブラリコードがあります(ソースコードを変更できません)。あるshared_ptrへのポインタを変換する

class A 
{ 
    public: 
    A(boost::shared_ptr<B> val); 
    ... 
    private: 
    boost::shared_ptr<B> _val; 
    ... 
}; 

int main() 
{ 
    B *b = SomeLib(); 
    A a(b); //?? 
    delete b; 
    ... 
} 

が、私はBのディープコピーを作成し、下にその寿命を制御したい場合でも、(:私は、コンストラクタのこのタイプのクラスの下のshared_ptrとして、このポインタを格納したいと思います元のbは削除されます(削除b)、私はまだa)の下に正確なコピーを持っています。

それは些細なようであれば、私はあなたが言うように、あなただけのポインタをコピーしないそれらをコピーする必要が...

答えて

2

申し訳ありませんが、これに新たなんです。だからBは既に "クローン"メソッドを実装しているか、同じ状態の新しいBを作成する外部のB* copy(B* b)を実装しなければなりません。 Bは、あなたが

B* copyOf(B* b) 
{ 
    return b->clone(); 
} 

としてコピーを実装することができ、その後、あなたのコードは

のようになります clone method or similar実施している場合は、あなただけの

B* copyOf(B* b) 
{ 
    return new B(*b); 
} 

としてコピーを実装することができ、Bはコピーコンストラクタを実装している場合は

int main() 
{ 
    B *b = SomeLib(); 
    A a(copyOf(b)); 
    delete b; 
    ... 
} 
+0

私は関数 'copy'の使用を見ません... –

+0

main関数の2行目です。 –

+0

@Mykola:私はそれを見る - しかし私はそれを得ていない:それは単に意味をなさない。ごめんなさい。 –

1

ディープコピーはC++で簡単に実装されていますコピーコンストラクタによって、C++ではすべてオブジェクトはデフォルトで値セマンティクスを持ちます。このような方法でのコピーは多形オブジェクトでは機能しません。そのような場合は、クラス内で実質的にオーバーライドされたcloneメソッドを実装する必要があります。

しかし、他のすべての場合には、単に

A(boost::shared_ptr<B> val) : _val(new B(*val)) { } 

の書き込みは行います。ライブラリは、このBのオブジェクトを定義する場合はクラスAは専ら本の寿命を制御している場合

+0

待機待ち。オブジェクトに生ポインタがある場合は注意してください。 –

+1

+1。私はあなたの答えをdownvoteする理由が表示されません。それどころか。 –

+0

Mykola:どの生ポインタ?それはここでは不可能です。この回答は完全に正しいです。 –

2

、ライブラリは

、追記ようB.

をコピーするための機構を提供する(または完全に禁止)すべきですあなたが実際に使用したいスマートポインタはboost::scoped_ptrです。

boost::shared_ptrは、生涯の責任を分担する能力の名前にちなんで名付けられています。これは、あなたが望ましくないように聞こえるものです。 scoped_ptrはそれが間違って起こることはありません。

+0

またはクラスのメンバーのみ。 –

関連する問題