2011-12-17 7 views
6

私はこのコードを持っていますが、実際的な例ではありません。ref型のクラスメンバーを持つ目的は何ですか?

Ex。

class Animal 
{ 
    int i; 
    int& ref; 
    public: 
    Animal() : ref(i) 
    { 
    } 
}; 

誰もが、私はそれをよりよく理解できるように、refはクラスのメンバとして必要とされる実際の例を提供することはできますか?

+1

@pst:それはまったく無関係です。 C++の参照はリバウンドできません。したがって、リバインド可能な参照の使用例は何も追加しません。 –

+0

@BenVoigt *完全には関係ありません(私が作成するタイプのほとんどは突然変異を避ける/「読取り専用」のメンバーを持っています)。あなたは非常に有効なポイントを持っています。 –

+0

@ user966379、あなたは "同じクラスの他のメンバーを参照するref型のクラスメンバーを持つ目的は何ですか?"と言い換える必要があると思います。これは将来的にウェブサーチャーを助けるでしょう。 –

答えて

3

何らかのクラスAの複数のオブジェクトがすべて、同じクラスまたは別のクラスの1つの共有インスタンスを参照する必要があるときはいつでも。それは基本的にconstポインタと同じだ

class Person { 
    private: 
     Person &mother_; 
     Person &father_; 

    public: 
     Person(Person &mother, Person &father) : mother_(mother), father_(father) {} 
     // ... 
} 
+3

OPの利益のために、これはオブジェクト指向プログラミングでよく使用される集約と呼ばれます。 –

+0

@ChrisParton私はこの「集約」を考慮しません。オブジェクト指向のコンテキストで「集約」を考えると、継承を使用しない型拡張の形式として使用すると思います。 「集約」オブジェクトへのメソッドは、内部/プライベートオブジェクト(「集約されている」)にプロキシされます。この場合、新しいオブジェクトを作成するのではなく、むしろ同じ「共有」オブジェクトを参照することだけです。 (人は母親Personまたは父Personを「拡張」しません) –

+1

これは、参照がリバウンドできず、ポインタができるため、ポインタではなく*参照*を使用する理由を説明していません。参照を使用することによって、コピーコンストラクタを確保する必要があります。 –

1

確か:テンプレートクラスstd::reference_wrapper<T>の全目的は参照を保持することです!

これには多くの用途があります。たとえば、std::threadコンストラクタ(常にコピーを作成する)に渡すことができます。また、参照ラッパーのコンテナーを作成することもできます。

何かへの参照を保持することは、出力ストリームをラップする場合にも役立ちます。元のストリームを参照として保持し、そのストリームに物を追加します(たとえば、基本ストリームへの参照をラッパーオブジェクトに追加することによって、this answer of mineを改善することができます)。

+0

std :: reference_wrapperはC++ 11ですか? Haventは全体標準をまだ読んでいます –

1

:例えば、いくつかのPeopleはすべて同じ母親および/または父親を持つことができます。他のオブジェクトにnull以外のポインタが必要で、そのポインタが構築中にのみ割り当てられる場合は、代わりに参照を使用することもできます。

関連する問題