2017-03-29 9 views
-2

オブジェクトを正しくカプセル化する方法がわかりません。カプセル化の混乱

例:

struct Car { 
    int wheels = 0; 
    int doors = 0; 
}; 

class A{ 
    Car myCar; 

public: 
// 1st method 
    Car getCar() const { return myCar; } 
    void setCar(Car c) { myCar = c; } 
// 2nd method 
    Car &getCarReference() { return myCar; } 
// 3rd method 
    Car *getCarPointer() { return &myCar; } 
}; 

私は第一の方法は、例に示すような構造が小さければ結構です、私の構造のコピーを作成します理解しています。しかし、構造体が100,000の二重値を含む場合はどうでしょうか? 2番目の方法を使うべきですか?または、構造体ポインタを宣言し、動的にメモリを割り当て、3番目のメソッドを使用しますか?私はあなたが欲しいものを想定し

+0

[*戻り値の最適化*](https://en.wikipedia.org/wiki/Return_value_optimization)と[* copy elision]についての記事を読んでください。 *](https://en.wikipedia.org/wiki/Copy_elision)。最適化をマイクロ管理することは決してありません。常に良い、保守可能で読みやすい* working *コードを書いてください。パフォーマンスが "十分に良い"ものでない場合は、ボトルネックを見つけてそれらを最適化するために測定、プロファイル、およびベンチマークを行います。 –

+2

質問のタイトルは少し誤解を招く。問題は、値型と、カプセル化とは無関係な参照型のいずれかのsematicsに関するものと思われます。 – Codor

+0

'const'リファレンスについてもお読みください。それは助けになるはずです。 – elimad

答えて

1

はこれです:

いくつかのクラス、Aは、別のクラス、車をラップします。 AのCar要素にアクセスできるはずですが、Car要素をpublicにすることはできません。なぜなら、誰かがその要素を変更する必要がある場合(そうでない場合は単純にpublicにする)、ラッパークラスの不一致の可能性があるからです。 。

もしそうなら、const参照で行く:

const Car& getConstCarReference() const { return myCar; } 

これは、その後

const Car& car = instanceOfA.getConstCarReference(); 

のように呼ばれて、その後、あなたは車の上に任意の定数コールを使用することができます。

ところで、ポインタを返すことは、ほとんどの場合、悪い考えです。基本的には、ポインタを返すと思うときはいつも、ポインタを返すことが最良の解決策である理由を明確に主張できるはずです。

しかし、私は "get"や "set"のようなメソッド名を控えておくことをお勧めします。有機的なクラスを扱う代わりに時計を時計のように見せてください。 const Car& car() const { return m_car; }のように、ハンガリー表記のメンバ変数(ハンガリー表記を使用することは重要ではありませんが、少なくともクラスがそうでない場合はメンバ変数を明示することをお勧めします) )