c++中如何使用临时实例的成员

How to use members of temporary instance in C++?

本文关键字:实例 成员 何使用 c++      更新时间:2023-10-16

我有一个具有复制构造函数和赋值操作符的对象A,它有一个成员QVector。我是这样用的:

QVector<B*> x = GetA().GetVector();
x.at(0)->doSomething();

现在我想对向量中的所有B做一些事情,但是因为从GetA()我只得到一个临时副本,指针已经被删除了。有没有其他的方法,比如

A a = GetA();
QVector<B*> x = a.GetVector();
x.at(0)->doSomething();

这是我的复制构造函数的问题还是我可以在复制构造函数或赋值操作符的实现中修复的任何其他问题?

谢谢

不,这不是复制构造函数的问题,但这当然是"别的东西"。

你应该从GetVector()函数返回一个共享指针的向量,因为你真正想要的是在A对象和这个问题中的代码之间共享这个向量中的B*对象的所有权。

(更新)

方法链接:GetA().GetVector().at(0)->doSomething();将工作,因为c++标准保证直到顺序点(在本例中为;)所有临时存在。

如果你把它分成很多行,就像你的例子一样,那么你应该把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());
}