1

我有一个带有复制构造函数和赋值运算符的对象 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();

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

谢谢

4

1 回答 1

3

不,这不是您的复制构造函数的问题,但这当然是“其他事情”。

您应该从函数返回一个共享指针GetVector()向量,因为您真正想要的是B*在此向量中的某个对象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());
}
于 2013-04-19T10:51:14.200 回答