3

クラスのインターフェイスラッパーを作成しています。クラス内のメンバーは参照です(大きな構造体のコピーを避けるため)。プライベートコンストラクターを作成する場合、コンパイラーをなだめるためにその参照を初期化する最良の方法は何ですか?

struct InterfaceWrapper {
    InterfaceWrapper( SomeHugeStructure& src ):m_internal(src){};
    int someElement(void) const { return m_internal.someElement; };
private:
    InterfaceWrapper(){}  // initialize m_internal
    SomeHugeStructure& m_internal;
};
4

4 に答える 4

4

要素を持たずにクラスを作成する必要がある場合は、参照を使用することはできません。

参照を使用する唯一の理由がコピーを回避することである場合は、ポインターを使用することをお勧めします。通常のコンストラクターで渡された参照のアドレスを取得し、プライベートコンストラクターでNULLに初期化するだけです。オブジェクトの存続期間が終了すると、ポインタはダングリングポインタになりますが、参照についても同じことが言えます。

または、ライフタイムが心配な場合は、パブリックコンストラクターにスマートポインターを取得させ、そのようなスマートポインターをメンバーとして使用することもできます。

そしてもちろん、クラスのコードの残りの部分でポインタがNULLになる可能性があることに対処してください。(ただし、リファレンスケースでもスタブになる可能性のあるメンバーに対処する必要があったため、実際には問題にはなりません)

于 2008-11-12T16:57:14.020 に答える
4

他の人が述べたように、あなたの目的が他の人がデフォルトのコンストラクターを呼び出さないようにすることである場合、ボディをまったく提供したくありません。別のコンストラクターがあり、コンパイラーがそれを生成しないため、ボディを宣言する必要はありませんあなた。

目的がクラスのフレンドへのアクセスを制限することである場合は、おそらくポインター (できればスマート ポインター) メンバーを持ち、それを NULL に設定するのが最善でしょう。

--

また、なぜこれをクラスではなく構造体にしたのかわかりません。一般に、C と同様に、データ メンバーを public として公開する場合、構造体を作成することは理にかなっています。この場合、従来のクラスがあるように見えます。

于 2008-11-12T17:44:10.197 に答える
2

デフォルトの ctor を非公開にして誰も使用できないようにする場合は、本文をそのままにしておきます。

private:
    InterfaceWrapper();
    SomeHugeStructure& m_internal;

コンパイラはそれが別の場所で定義されていると判断し、リンカは誰かがそれを使用しようとしない限り、定義されていないことを気にしません。

于 2008-11-12T17:00:29.537 に答える
1

民間俳優のポイントは何ですか?m_internal が有効なオブジェクトを参照していない場合、どのように役立つのでしょうか?

また、m_internal-> はコンパイルされません。これはポインタ構文であり、ref ではありません。

于 2008-11-12T16:58:41.897 に答える