(这里有3个相关问题)
我在 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) 如果我在 y
?
2) 如果 x 是 vector 或另一个 STL 集合的对象,上述内容会改变吗?还是适用相同的规则?
3) 构造函数中的指针被分配给数据成员的类呢:
class X{
public:
X(Something* x);
private:
Something* x;
}
X::X(Something* &y){
x = y;
}
y
是否必须在此处通过引用传递,否则会分配指针的拷贝?我问这个是因为我在这里问了另一个 SO 问题:
最佳答案
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;
}
关于c++ - 避免无意中复制对象——可用的技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20020153/