0

(関連する質問が 3 つあります)

私が C++ で遭遇する最も厄介なことの 1 つは、誤ってオブジェクトを渡したりコピーしたりしてから、その状態が期待どおりではないことに疑問を抱くことです。最近、ポインタ渡しをしている状況がありましたが、期待した状態が得られず、参照渡しでポインタを渡さなければならないことが判明しました。

この状況を考えると、確認できますか:

MyClass x;
AnotherClass y;
y.passMyObjectSomewhere(x);
.
.
.
.
//Later on x is changed and I wish to see this change in y
x.modifyMyObject();

xの更新状態を維持するために、次の手法を利用できますy

MyClass* x = new MyClass();
y.passMyObjectSomewhere(x);
.
.
.
delete x;

また

MyClass x;
y.passMyObjectSomewhere(&x);

また

shared_ptr<MyClass> x(new MyClass());
y.passMyObjectSomewhere(x);

1) ?の外側に変更を加えた場合、上記のすべての選択肢はオブジェクトx内で更新され続けます。yxy


2) x がベクトルまたは別の STL コレクションのオブジェクトであった場合、上記は変わりますか? それとも同じルールが適用されますか?


3) コンストラクター内のポインターがデータ メンバーに割り当てられているクラスについてはどうですか。

class X{
    public:
        X(Something* x);

    private:
        Something* x;
}

X::X(Something* &y){
    x = y;
}

yそうしないと、ポインターのコピーが割り当てられるため、ここで参照によって渡す必要がありますか? 私がここで尋ねた別のSOの質問のために、私はこれを尋ねます:

ポインター代入へのポインターが機能しない

4

1 に答える 1

1

1) はい、x へのポインターを格納する場合は、そうする必要があります。yただし、最初の 2 つの例には注意してくださいx。のポインターは、y指しているオブジェクトが削除されることを認識せず、これにより確実にクラッシュが発生します。

MyClass* x = new MyClass();
y.passMyObjectSomewhere(x);
.
// update x
y.doesSomeActionOnX(); // no crash
delete x;
y.doesSomeActionOnX(); // crash

所有権のstd::shared_ptr共有を処理するため、より良いオプションです。あなたができるところで:

auto x = std::make_shared<MyClass>();

2) どこでも同じルール。

3)あなたの参照はここではまったく役に立ちません。

X::X(Something* y)
{ 
  this.y = y;
}
于 2013-11-16T15:52:24.067 に答える