0

(这里有三个相关的问题)

我在 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?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似乎能够活得更久x。in 的指针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 回答