あなたのコードに基づいて、クラスの外部からベクトルの要素を更新できるようにしたいようです。
ただし、これに到達する前に、一時オブジェクトへの参照を格納しているという問題があります ( でvector
構成されています{1, 2}
)。このオブジェクトは、呼び出しがSomeClass( {A, B} )
完了すると割り当てが解除されます。
これを解決するには、次の 3 つの方法があります。
オブジェクトの存続期間がわかっている場合は、インスタンスSomeClass
の外部でベクターにコピーできます。たとえば、それを作成した関数の期間だけ存在する場合は、次のようなことができますSomeClass
f
f
std::vector<int> aVector({A, B});
SomeClass f = SomeClass(aVector);
作成関数は「所有」しaVector
、f
それへの参照を持っています。
SomeClass
インスタンスにベクターのコピーを作成させることができます。このために、参照によってベクトルを渡すことができますが、コンストラクターでコピーを作成します。
class SomeClass
{
std::vector<int> data;
public:
SomeClass(const std::vector<int> &_data) : data(_data) {}
...
}
f
現在、ベクターの独自のコピーを「所有」しています。ただし、オブジェクトの外部から要素の値を変更することはできなくなります。そのため、オプションである場合は、ポインターをベクター ( std::vector<int*>
) 内に格納するか、コンテンツを変更するためのメソッドをクラスに提供する必要があります。
移動セマンティクス (C++11) を使用して、引数ベクトルの内部ストレージがコピーされず、SomeClass::data
構築中に再割り当てされるようにすることができます。
class SomeClass
{
std::vector<int> data;
public:
SomeClass(std::vector<int> &&_data) : data(std::move(_data)) {}
...
}
前と同じように、f
ベクトルを「所有」します。繰り返しf.data
ますが、オブジェクトの外部から の内容を変更することはできないため、ベクトルにポインターを格納するか、メソッドを提供する必要があります。
これらのケースのいずれにおいても、上に書かれているように、更新によってベクトルの内容を変更することはできませんA
。これはA
、ベクトルの作成時に のコピーが作成され、そのコピーが値を保持するためです1
。
(2) と (3) の場合、 update によってベクトルを更新できるようにするにはA
、前述のようにベクトルにポインターを格納する必要があります。(1)の場合も同様です。ポインターを格納するときは、ポインターを使用している限り、ポインターが指しているメモリが持続することを確認する必要があることに注意してください。基本的に、ベクター自体で解決するのと同じ所有権の問題です。
(1) の場合、は への参照を持っているaVector[0]
ため、を更新することでベクトルの内容を更新することもできます。f
aVector