1

はじめに:派生(具象)クラス型のオブジェクトからの(抽象)基本クラス参照を格納できるようにしたいので、後でポインターに頼らずに同じ派生(具象)クラスにキャストできます。所有権、メモリリーク、ダングリングポインタ/不正な参照について心配する必要があります。

以下の階層を使用して、試行されたコンストラクター呼び出し: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

};
4

1 に答える 1

3

参照を期待するクラスに一時オブジェクトを渡して、コードがおかしくならないようにする方法はありますか?

いいえ。参照を処理するときに所有権についてそれほど心配する必要がない理由は、所有権が他の場所、特に参照される変数を所有するレベルで処理されるためです。

参照されているオブジェクトが範囲外になると、参照は無効になります (そうです、参照もぶら下がっている可能性があります)。参照されているオブジェクトは、それへの参照がアクティブに使用されている限り存在している必要があります。そのため、一時オブジェクトを参照とうまく連携させることができません。一時オブジェクトはすぐに範囲外になり、それらへの参照が役に立たなくなります。

于 2012-12-15T21:07:34.767 に答える