趣味でC++ ( Better-C というやつ ) をやっています。
馬鹿みたいな(くだらない)質問ですが宜しくお願いいたします。
C++11ぐらいから スマートポインタっていうのがあるようですね。
「生ポインタを使うぐらいならスマートポインタを使え」とか「モダンなC++はスマートポインタで行う( 生ポインタと比較して。 )」とかよくサイトで目にします。
スマートポインタについて自分なりに調べてみましたが、イメージがしづらいです。
shared_ptr:
所有権 ( 管理権? ) は単一オブジェクトが所有し、内部のカウンタをインクリメント/デクリメントでカウントし、
カウンタが 0 になったら完全に破棄される。
weak_ptr:
循環参照(?) するときや 所有権が不要な場合。
unique_ptr:
shared_ptrのカウンタ系を省いて、ある意味 Singletonパターンみたいな感じ?
という認識です。
で、これの使い方は調べればいいですが、どれを使うべきなのか判断ができません。
趣味で組んでいるので 自分用のライブラリを組んでいます。
例えばCTest1 と CTest2 というクラスがそれぞれあり、単一方向でCTest2 が CTest1 をコンポジションするとします。
( 例なのでくだらないものですが。 )
C++
1class CTest1{ 2 public: 3 CTest( int id ) : m_id(id){} 4 ~CTest(){} 5 6 int id( void ) const{ return m_id; } 7 private: 8 int m_id; 9}; 10 11 12class CTest2{ 13 public: 14 CTest( int id ) : m_id(id){ 15 test = new CTest1( id * 2 ); 16 } 17 18 19 ~CTest(){ delete test; } 20 21 int id( void ) const{ return m_id; } 22 23 int idEx( void ){ 24 return test.id() + m_id; // コンポジションしているオブジェクトのID + 自分のID 25 } 26 private: 27 int m_id; 28 CTest* test; 29};
こういう場合は shared_ptr を使うべきなのはなんとなくわかります。
ですが、
C++
1void func( CTest2 *obj ){ 2 cout << obj->idEx() << endl; 3} 4
等の場合はどう考えるといいでしょうか?
例えば「基本的には sharedの方でいいけど、循環参照になる場合はweakで行う」とか。
やはりすべてのパターンを考える必要があるのでしょうか?
[情報]
言語: C++ ( C++11 )
コンパイラ: MinGW
宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/29 04:03
2017/08/29 04:12