2

私が持っているとしましょう

struct someStruct
{
    int a;
};

そして2クラス。

最初のクラスのメソッドで、構造体のインスタンスを作成します。

someStruct structName;

今、この構造体のアドレスを別のクラスのコンストラクターに渡したい

std::auto_ptr<2ndClass> 2ndClass_ (new 2ndClass(structName));

ここで 2ndClass で変更された構造体の値を使用したい - 以下を読んでください...

2 番目のクラスには次のものがあります。

ヘッダ:

...
class 2ndClass...
... 
private:
someStruct &structName2;
public:
__fastcall 2ndClass(someStruct &structName);
...

cpp:

__fastcall 2ndClass::2ndClass(someStruct &structName)
    : structName2(structName)
{
...

これは明らかに structName のコピーを作成します。

私の質問は次のとおりです。structName から structName2 にアドレスを割り当てて、構造体に読み書きし、2 番目のクラスを離れた後に最初のクラスでそれらの値を使用できるようにするにはどうすればよいですか? 構造体へのポインタを使用せずにどうすればよいですか?

4

1 に答える 1

4

これは明らかに structName のコピーを作成します。

いいえ、そうではありません。参照によって渡し、メンバーは参照であるため2ndClass::structName2、パラメーターとしてコンストラクターに渡す正確なオブジェクトを参照します。

問題は、structName から structName2 にアドレスを割り当てて、構造体に読み書きし、2 番目のクラスを離れた後に最初のクラスでそれらの値を使用できるようにする方法です。

参照を使用するため、その必要はありません。関数シグネチャで&は、アドレスではなく参照を表します。したがって、アドレスを渡すのではなく、オブジェクト自体を渡します。

元の構造が範囲外になると、ダングリング参照が発生するので、そのケースを必ず処理してくださいメモリが上書きされていなければ動作しているように見えるかもしれませんが、未定義の動作です。

于 2012-07-31T17:36:41.530 に答える