1

こんにちは、私を困惑させる質問をしたいと思います。

私はこのようなクラスを持っています:

class A { 

private:
std::vector<Object*>* my_array_;

...

public
std::vector<Object*>& my_array(); // getter
void my_array(const std::vector<Object*>& other_array); // setter
};

私はあなたの経験に基づいて、(可能な)安全な方法でセッターとゲッターを実装する正しい方法は何であるかをあなたに尋ねたいと思いました。

私の頭に浮かんだ最初の解決策は次のとおりです。

まず、セッターを実装するときは、次のことを行う必要があります。A)入力が既に保持しているデータ構造を参照していないことを確認します。B)my_array_が指すすべてのオブジェクトのメモリを解放します。C)other_arrayが指す各オブジェクトをコピーし、そのコピーをmy_array_に追加します。D)最後に関数を終了します。

念のため、ゲッターは内部配列のコピーを作成する場合があります。

質問はたくさんあります:-この戦略はやり過ぎですか?-それは本当に問題を回避しますか?-誰かが実際にそれを使用していますか、それともより良いアプローチがありますか?

私はこの質問に対する答えを探しようとしましたが、この問題に特に焦点を当てたものは何も見つかりませんでした。


スマートポインタを使用することは非常に良い答えです、私は両方に感謝します..私は複数に「有用な答え」を与えることができないようですので、事前にお詫び申し上げます。:-)

しかし、あなたの答えから、新たな疑問が生じました。オブジェクトに対してunique_ptrを含むベクトルを使用する場合、ディープコピーコンストラクターを定義する必要があります。現在スマートポインターを使用していることを考えると、イテレーターを使用してオブジェクトのベクトル内の各要素をコピーするよりも良い方法はありますか?

4

2 に答える 2

1

通常、ベクトルへのポインターをメンバーとして使用しないことをお勧めしますが、あなたの質問から、それは複数のインスタンス間で共有されているようです。

そうは言っても、私は一緒に行きます:

class A { 
private:
   std::shared_ptr<std::vector<std::unique_ptr<Object> > > my_array_;

public
   std::shared_ptr<std::vector<std::unique_ptr<Object> > >  my_array(); // getter
   void my_array(std::shared_ptr<std::vector<std::unique_ptr<Object> > >  other_array); // setter
};

チェックは不要で、メモリ管理の問題もありません。

内部Objectも共有されている場合は、のstd::shared_ptr代わりにを使用してstd::unique_ptrください。

于 2012-10-17T14:48:00.357 に答える
1

あなたはデータメンバーとしてのポインタを 持っていることを複雑にしすぎていると思います。std::vectorC ++はJavaではないことに注意してください(C ++は「参照」ベースよりも「値」ベースです)。

データメンバーとしてaへのポインタを使用する強い理由がない限りstd::vector、単純にstd::vector格納された「値による」を使用します。

さて、のObject*ポインタに関してvector、あなたは自分自身に尋ねるべきです:それらはポインタを観察しているのですか、それともポインタを所有しているのですか?

がsを監視するvectorだけの場合(オブジェクトプールアロケータなど、他の誰かが所有している場合)、生のポインタを使用できます(つまり、単純です)。ただし、ベクトルにsの所有権セマンティクスがある場合は、またはスマートポインターを使用する必要があります。ベクトルがインスタンスの唯一の所有者である場合は、 ;を使用します。それ以外の場合は、を使用します(これは、参照カウントメカニズムを使用してオブジェクトの存続期間を管理します)。ObjectObject*Objectshared_ptrunique_ptr Objectunique_ptrshared_ptr

class A 
{ 
public:
  // A vector which owns the pointed Objects
  typedef std::vector<std::shared_ptr<Object>> ObjectArray;

  // Getter
  const ObjectArray& MyArray() const
  {
      return m_myArray
  }

  // Setter 
  // (new C++11 move semantics pattern: pass by value and move from the value)
  void MyArray(ObjectArray otherArray)
  {
      m_myArray = std::move(otherArray);
  }

private:
  ObjectArray m_myArray;
};
于 2012-10-17T15:20:10.100 に答える