1

前言:我希望能够存储来自派生(具体)类类型的对象的(抽象)基类引用,以便以后可以将其返回并转换为相同的派生(具体)类,而无需求助于指针并不断拥有担心所有权、内存泄漏和悬空指针/错误引用。

使用下面的层次结构,尝试的构造函数调用:A(/* Other variables */, Bar(/* Bar variables */));失败并显示 `Warning 3 warning C4239: nonstandard extension used : 'argument' : conversion from 'Bar' to 'Foo&' (Visual Studio 2010 SP1)

将 更改class O为包含 aFoo* _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

};
4

1 回答 1

3

有没有办法将一个临时对象传递给一个需要引用的类并且不会让代码变得疯狂?

不。当您处理引用时,您不必担心所有权的真正原因是所有权在其他地方处理 - 特别是在拥有被引用变量的级别。

当被引用的对象超出范围时,引用就变得无效(是的,引用也可以悬空)。只要对它的引用处于活动状态,被引用的对象就必须一直存在。这就是为什么你不能让临时对象很好地与引用一起使用:临时对象很快就会超出范围,从而使对它们的引用变得无用。

于 2012-12-15T21:07:34.767 回答