c++中如何使用临时实例的成员
How to use members of temporary instance in C++?
我有一个具有复制构造函数和赋值操作符的对象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());
}
相关文章:
- 依赖于类成员属性的类实例成员
- 实例成员与静态成员与非类方法的开销
- 将成员函数分配给实例成员的属性
- 向量映射作为实例成员的C 地图
- 如何转发声明模板实例成员函数
- 如何确保父实例成员的销毁
- 访问模板类型实例成员
- boost :: Spirit :: Qi-与语法结构中的实例成员一起工作
- 如何使用类实例成员函数指针填充函数指针成员
- C func 到C++具有非双射参数类型映射的实例成员蹦床
- 当拥有的对象退出范围时,在类实例成员上使用shared_ptr是否会正确清理
- 类实例成员初始化
- 无效SetSomeValue(int i);实例成员函数跟踪谁使用SetSomeValue()设置了SomeValue成
- 重新分配作为实例成员的数组
- 回调需要const函数,如何传递对象的实例成员
- 如何通过std::shared_ptr访问实例成员变量
- c++类实例成员是如何在机器级别传递的
- 指向实例成员的函数指针
- 如何使用 Python C/C++ 接口将实例成员函数作为 PyCFunction 类型传递
- 如何将实例成员函数作为回调传递给 std::thread