5

オブジェクトのリストを に保存したいのですstd::vectorが、オブジェクトに参照が含まれており、割り当てることができません。ただし、オブジェクトをコピー構築することはできます。

私が考えることができる唯一のオプションは、ポインターを使用してオブジェクトをラップし、ポインターを割り当てる必要があるときにポインターを再配置することですが、この構文は、特に反復子を使用する場合に読みやすさを大幅に低下させるため、別の方法をお勧めします。

動作しません:

std::vector<MyObject> myVector;
//fill the vector
//...
myVector[1] = object1;

スマート ポインターは可読性を犠牲にします。

std::vector<std::unique_ptr<MyObject>> ptrVector;
//fill the vector
//...
ptrVector[1] = std::unique_ptr<MyObject>(new MyObject(object1));

で割り当て不可能なオブジェクトを使用する他の方法はありstd::vectorますか?

4

2 に答える 2

2

これはあなたの質問に対する直接的な回答ではありません。私は の代替品std::vectorや、必要なことを実行できるようにする別の使用方法を提供できないからです。

ただし、 の定義を変更できる場合は、従来の参照の代わりにMyObject使用するように変更するオプションがあるかもしれません。std::reference_wrapperこれによりMyObject、割り当て可能になります。

例:

#include <vector>
#include <functional>
#include <iostream>

struct MyObject
{
  //int &_i;
  std::reference_wrapper<int> _i;
  MyObject(int &i):_i(i) {}
};


int main() {
  std::vector<MyObject> vec;
  int i1 = 3;
  int i2 = 4;
  MyObject c1(i1);
  MyObject c2(i2);

  /* Storing object. */
  vec.push_back(c1);

  /* Assigning to it. */
  vec[0] = c2;

  /* Confirming that it's the correct object now. */
  for (const MyObject &it : vec)
    std::cout << it._i << std::endl;

  /* Modifying the value of its internal reference. */
  vec[0]._i.get() = 5;
  /* Confirming that the original int changed value indeed. */
  std::cout << "i2 == " << i2 << std::endl;

  return 0;
}

警告:既存のコードには、参照メンバー (つまり、_i上記のコードで呼び出されたメンバー) への直接割り当てが既に含まれている場合があります。これらの割り当ては、参照が参照するオブジェクトの値を変更することを目的としていました。参照を に置き換える場合std::reference_wrapper、すべての直接代入_i = xを に置き換える必要があります_i.get() = x。そうしないと、プログラムのセマンティクスが完全に変わります。

(編集) 使用される参照が const-references のconst T&場合、 astd::reference_wrapper<const T>を使用できます。上記の例を使用すると、MyObjectthen の定義は次のように変わります。

struct MyObject
{
  std::reference_wrapper<const int> _i;
  MyObject(const int &i):_i(i) {}
};
于 2012-10-16T03:32:48.210 に答える
0

「MyObject」を割り当て可能にしないのはなぜですか? 演算子「=」をオーバーライドできるため、「myVector[1] = object1」が機能します。

于 2012-10-16T03:14:54.257 に答える