"foo"という型の要素を保持するメンバーベクトルを含むクラス "foo"があります。このクラスには "make"というメソッドがあり、 "foo"オブジェクトを作成してベクトルに追加します。私はまた、 "foo"オブジェクトをナビゲートする方法を提供し、 "foo"ベクトル要素は "get"と呼ばれます。"* this"が参照するものを変更するC++クラス
どの "foo"オブジェクトでも "this"が参照しているものをベクトル内のfooオブジェクトを指すように再割り当てしたいと思います。私は、特定の "foo"メンバーへの参照をバインドせずに、fooオブジェクトをより効率的にナビゲートして追跡する方法として、この機能をコードに与えたいと思います。私は "* this"が何かを再割り当てする "setAsNode"というメソッドを通してこれをやろうとしています。
ここで私は、私は全体の私のポイントを取得すると信じているアップ嘲笑いくつかのサンプルコードです:私はおそらく実装してる実感
foo f1("test1");
f1.make("test2").make("test3");//pushes a new foo element back to the vector in f1 and pushes a new foo element back to it's vector
f1.get(0).get(0);//refers to the deepest nested object we just made above, cumbersome to type especially if the nesting is deep
f1.get(0).get(0).setAsNode();//this is where the error occurs, the desired effect is to make f1 the same object as denoted by f1.get(0).get(0);
foo& f2 = f1.get(0).get(0);//f2 would be equivalent to what I want the above code to reset f1 to be (or at least how I'd like it to act)
:
struct foo{
foo(const std::string &r):s(r){}
foo& make(const std::string &r){children.push_back(test(r)); children.back().originalNode = originalNode; return children.back();}
foo& setAsNode(){*originalNode = *this; return *originalNode;}
foo& get(int i){return children.at(i);}
private:
std::vector<foo> children;
std::string s = "someData";
foo *originalNode = this;
};
、これが機能するかの具体例は、 "foo"オブジェクトを返すためのポインタの代わりに参照を使用するなどの非常に悪いプログラミング慣行がありますが、正にこのプログラムを正しく構成する方法や、このプログラムのベストプラクティスバージョンがどのように見えるか、わかりません。私に物事を「正しい」方法で示すことができる人のためのボーナスポイント。
実際の質問に戻る:私はこのようなもの、具体的には "setAsNode"メソッドを実際に動作させるにはどうしたらいいですか?また、私の例のコードはなぜ機能しないのですか?コンパイルは正常に実行されるとクラッシュします。
あなたがSTD 'のコンテナを使用する場合は:: unique_ptrを'代わりに、あなたはそれぞれの 'T'のアドレスが変更されていないことを保証することができます。 'unique_ptr'だけが動きます。また、より有利な参照無効化ポリシーを持つコンテナの使用を検討することもできます。例えば、 'std :: list'は問題の要素がリストから削除されたときだけ参照を無効にします。 –
タイトルの質問に直接答えるには、「this」が別のインスタンスを指すようにする方法がありません。せいぜい、別のインスタンスのメソッドを呼び出すことができます。ここでは、 'this'は前のコンテキストとは' this'と異なります。 –
あなたが必要と主張するものがなぜ必要なのか理解できません。 'originalNode'と' setAsNode'を削除すると、あなたのサンプルのほとんどすべてがうまく動作します。 –