0

私はsmartpointer-templateを実装しています。スマートポインタを別の関数へのパラメータとして渡すときに参照カウンタを増やすにはどうすればよいですか?リファレンスカウントを増やすためにどの演算子をオーバーロードしますか?例えばスマートポインタをパラメータとして関数に渡す

class test 
{ 
    test() { } 
    ~test() { } 
}; 

void A() 
{ 
    SmartPointer<test> p; 
    B(p); 
} 

void B(SmartPointer<test> p) 
{ 
    C(p); 
} 

void C(SmartPointer<test> p) 
{ 
    // p ref count is still 1 and will be destroyed at end of C 
} 

おかげ

+1

** ** ref-count呼び出しを自分で実装する場合は、すべてのコンストラクタ(コピーコンストラクタを含む)とデストラクタでそれを行う必要があります。しかし、あなたはする必要はありません。単に 'boost :: intrusive_ptr'を使ってください。名前にかかわらず、侵入型ポインタを実装する必要はありませんが、それはref-count呼び出しを処理するだけです。乾杯、 –

+0

警告してください。スマートなC++の人でも、正しいスマートポインタの作成には問題があります。スコット・マイヤーズは、彼の講義で頻繁に彼の試みについて語っています(出版の5年後でさえ(出版前に広範囲にレビューされた後でさえ))彼はまだそれについて電子メールを受け取りました。標準のスマートポインタには、間違いがないことを確認するために、それらをチェックするためにそれらを見ている100,000人の人々がいました。 –

答えて

5

あなたのスマートポインタのすべてコンストラクタは、コピーコンストラクタを含め、参照カウントを操作しなければならない、と代入演算子も関与する必要があります。

これが困った場合は、スマートポインタを書くのが早すぎるかもしれません。代わりに、高品質のstd::shared_ptrを当面使用することができます。

+0

コピーコンストラクタとは何ですか? – KaiserJohaan

+1

@KaiserJohaan:これは、署名 'T :: T(T const&)'または 'T :: T(T&)'を持つコンストラクタです。通常は前者です。 –

1

あなたのコピーコンストラクタと代入演算子で注意してください。

2

パラメータを渡すと、パラメータがコピーされ、コピーコンストラクタが呼び出されます。等価演算子に同時に過負荷をかけることは、一般的には良い考えです。

いずれか、またはboost :: shared_ptrまたは他の既存のクラスを使用します。あなたはこれを使用していない何らかの理由がありますか?

+0

コピーコンストラクタとは何ですか? – KaiserJohaan

関連する問題