前言:我希望能够存储来自派生(具体)类类型的对象的(抽象)基类引用,以便稍后可以返回它并强制转换为相同的派生(具体)类,而无需求助于指针并且经常需要担心所有权、内存泄漏和悬空指针/错误引用。
使用下面的层次结构,尝试的构造函数调用:A(/* Other variables */, Bar(/* Bar variables */));
失败并显示 `Warning 3 warning C4239: nonstandard extension使用:'argument':从'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
};
最佳答案
Is there a way to pass a temporary object to a class that expects a reference and not have the code go bonkers?
没有。在处理引用时不必太担心所有权的原因是所有权在其他地方处理 - 特别是在拥有被引用变量的级别。
当被引用的对象超出范围时,引用就变得无效(是的,引用也可能是悬空的)。只要对它的引用处于事件状态,被引用的对象就必须保留。这就是为什么你不能让临时对象很好地与引用一起玩:临时对象很快就会超出范围,使对它们的引用变得无用。
关于c++ - 将临时派生对象传递给需要基础对象引用的方法/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13896162/