c++ - 如何在 C++ 中使用临时实例的成员?

标签 c++ copy-constructor temporary method-chaining

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

相关文章:

android - 如何在 Android 上保存临时数据?

C++ 返回对临时对象的引用或将它们存储在对象中

c++ - 文件 IO 打印到屏幕

c++ - 找到小于特定值的最大排列

c++ - 这些代码片段有什么区别?

c++ - 64 位环境中引用的大小

c++ - 在 C++ 中,对具有唯一 ID 的对象进行复制/move/分配的正确方法是什么?

c++ - 删除与空复制构造函数

c++ - 抛出异常时是否创建 std::exception 对象?

c++ - auto&& 将如何延长临时对象的生命周期?