(这里有三个相关问题)
我在C ++中遇到的最糟糕的事情之一是偶然传递/复制一个对象,然后想知道为什么它的状态不是你所期望的。我最近有一个情况,我通过指针传递,但我没有得到我期望的状态,结果我不得不通过引用传递指针,这真的把我扔了!
鉴于这种情况,我能否确认一下:
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
之外对y
进行了更改,那么上述所有备选方案都会在x
对象中保持y
更新?
2)如果x是向量或另一个STL集合的对象,上述情况是否会发生变化?或者适用相同的规则吗?
3)将构造函数中的指针分配给数据成员的类如何:
class X{
public:
X(Something* x);
private:
Something* x;
}
X::X(Something* &y){
x = y;
}
这里是否必须通过引用传入y
因为否则将分配指针的副本?我问这是因为我在这里问了另一个问题:
答案 0 :(得分:1)
1)是的,如果您存储指向x的指针,它们应该是。但是在你的前两个例子中要小心,y
似乎能够比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;
}