前言:我希望能够从派生(具体)类类型的对象存储(抽象)基类引用,以便稍后可以返回并转换为相同的派生(具体)类,而无需求助于指针并且经常不得不担心所有权,内存泄漏以及悬挂指针/错误引用。
使用下面的层次结构,尝试的构造函数调用:A(/* Other variables */, Bar(/* Bar variables */));
失败并显示“警告3警告C4239:使用非标准扩展名:'参数':从'Bar'转换为'Foo&' (Visual Studio 2010 SP1)
将class O
更改为包含Foo* _foo
并将构造函数初始化更改为/*...*/, _foo(&foo)
会导致悬空指针,因为临时对象在构造函数完成时会被销毁。
有没有办法将临时对象传递给需要引用的类,而不会让代码变得疯狂?
`
/* ABSTRACT BASE CLASS */
class Foo {
//...
};
/* DERIVED, CONCRETE CLASS */
class Bar : public Foo {
//...
};
class O {
O(/* Other variables */, Foo& foo) : /* Other member variable initializations */, _foo(foo) { }
//...Other member variables here...
Foo& _foo;
friend class A;
};
class A {
public:
A(/* Other individual variables used to fully construct object 'O' */, Foo& foo) : /*...*/, _foo(foo) { }
private:
O _o
};
答案 0 :(得分:3)
有没有办法将一个临时对象传递给一个需要引用但不会让代码变得疯狂的类?
没有。在处理引用时,您不必过多担心所有权的原因是所有权在其他地方处理 - 特别是在拥有引用变量的级别。
当引用的对象超出范围时,引用变为无效(是的,引用也可能是悬空)。只要对其的引用处于活动状态,被引用的对象就必须保持不变。这就是为什么你不能让临时演员与引用很好地合作:临时演员很快就会超出范围,对它们的引用变得毫无用处。