我有一个带有复制构造函数和赋值运算符的对象 A,它有一个成员 QVector。我这样使用它:
QVector<B*> x = GetA().GetVector();
x.at(0)->doSomething();
现在我想对 vector 中的所有 B 做一些事情,但是因为从 GetA() 我只得到了一个临时拷贝,指针已经被删除了。有没有不同的方法然后做类似的事情
A a = GetA();
QVector<B*> x = a.GetVector();
x.at(0)->doSomething();
这是我的复制构造函数的问题还是我可以在复制构造函数或赋值运算符的实现中解决的任何其他问题?
谢谢
最佳答案
不,这不是您的复制构造函数的问题,但这当然是“其他原因”。
您应该返回 shared pointers 的 vector 来自 GetVector()
函数,因为您真正想要的是共享 B*
对象的所有权,这些对象位于此 vector 中的某个对象 A
和您的代码出现在这个问题中。
[更新]
该方法链:GetA().GetVector().at(0)->doSomething();
将起作用,因为 C++ std 保证它直到顺序点 ( ;
在这种情况下)所有临时对象都存在。
如果您将它分成多行,就像您的示例中那样,那么您应该将 GetA()
的结果保存在某个命名变量中。
其他一些方法是使用额外的函数,使用 GetA()
作为参数(与您自己的解决方案非常相似):
void foo(const A& a)
{
QVector<B*> x = a.GetVector();
x.at(0)->doSomething();
}
foo(GetA());
甚至:
void foo(const QVector<B*>& x)
{
x.at(0)->doSomething();
}
foo(GetA().GetVector());
甚至在 C++11 中,使用 lambda 表达式:
int main() {
auto foo = [](const QVector<B*>& x)
{
x.at(0)->doSomething();
};
foo(GetA().GetVector());
}
关于c++ - 如何在 C++ 中使用临时实例的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16102758/