1

現在、次のようなベクターがあります。

vector<MyClass*> MyVector;

を使用してアクセスします

MyVector[i]->MyClass_Function();

を活用したいと思いますshared_ptr。これは、次のように変更するだけでよいということですかvector

typedef shared_ptr<MyClass*> safe_myclass

vector<safe_myclass>

以前と同じように残りのコードを引き続き使用できますか?

4

3 に答える 3

9

vector<shared_ptr<MyClass>> MyVector;大丈夫なはず。

ただし、のインスタンスがMyClassベクターの外部で共有されておらず、最新のC ++ 11コンパイラーを使用している場合vector<unique_ptr<MyClass>>は、より効率的ですshared_ptrunique_ptr参照カウントのオーバーヘッドがないためshared_ptr)。

于 2012-05-28T22:23:02.897 に答える
9

おそらくただstd::vector<MyClass>。あなたは

  1. ポリモーフィック クラスの操作または
  2. コピー コンストラクターを使用する余裕がない、またはコピーできない理由があり、このステップがコンパイラーによって書き出されないことを確信していますか?

もしそうなら、共有ポインタは行くべき道ですが、多くの場合、まったく利益がない場合にこのパラダイムを使用します。

変更を行う場合に完全にするためstd::vector<MyClass>には、コードが後で多態性になる場合に行うべき醜いメンテナンスが必要になる場合がありますが、必要な変更は typedef を変更することだけです。

その時点で、std::vector全体をラップすることが理にかなっている場合があります。

class MyClassCollection {
     private : std::vector<MyClass> collection;
     public  : MyClass& at(int idx);
     //...
 };

そのため、共有ポインターだけでなく、ベクター全体を安全に交換できます。トレードオフは、ベクトルを期待する API に入力するのが難しくなりますが、それらは、クラスに提供できるイテレータで動作する必要があるため、適切に設計されていません。

これはアプリにとっては負担が大きすぎる可能性があります (クライアントに面したライブラリで公開する場合は賢明ですが) が、これらは有効な考慮事項です。

于 2012-05-28T20:46:46.677 に答える
1

共有ポインタにすぐにジャンプしないでください。オブジェクトのコピーを回避する必要がある場合は、単純なポインタコンテナの方が適している可能性があります。

于 2012-05-29T21:38:04.010 に答える