2011-09-12 7 views
1

私はクラスがあります。へのアクセスのプライベートメンバーは

class A 
{ 
private: 
ComplexClass member1; 

public: 
getMember1(){return member1;}; 
}; 

を、私は、それに取り組むために、そのメンバー1を取得するために必要なコードの簡略化のために(より簡単に理解できる)、という実装を持っています。私の心に来る最初の事は次のようになります。私は、新しいオブジェクトからではなくメンバー1からのポインタを取得(およびコンパイラの警告を取得します)していますので、明らかに正しくない

ComplexClass *myComplexClass = &getMember1(); 

myComplexClass.getSomething(); 
myComplexClass.getSomethingElse(); 
etc. 

私の質問です:このようなことをするには最高のデザインは何ですか?どのようにカプセル化を維持し、それにポインタを使用してメンバーのアクセスを容易にするのですか? (私はmember1からのみ読み込み、書き込みはしません)。

私はクラスAの内部

ComplexClass *getPointerToMember1() 

を作るべきか?

+0

'ComplexClass myComplexClass = a.getMember1(); myComplexClass.getSomething(); '? –

+0

あなたはたぶんゲッターを追加してはいけません。外部エンティティがメンバー1へのアクセスを必要とするのはなぜですか?これは唯一のエンティティですか?もしそうなら、それを友人にしてください。 –

答えて

3

const参照は編集を継続します。私の意見では、それはconstポインタよりもあなたの意図を明確にします。

class A 
{ 
private: 
ComplexClass member1; 

public: 
const ComplexClass &getMember1(){return member1;}; 
}; 
+1

これは、潜在的にカプセル化が難しくなることを意味します。これは、参照するために* ComplexClassオブジェクトが必要であることを意味します。 (メンバ変数を保持しないが、オンデマンドで 'ComplexClass'オブジェクトを動的に生成する' A'の将来の実装を想像してください) –

+0

Ok。私はそれを信じています:ComplexClass myComplexClass = A.getMember1(); myComplexClass.someInteger = 10;有効な実装です。 –

+0

@Oliこの例では、すでにオブジェクトが作成されています。それが表現されたやり方では、私はコードがすでにあまりにも高すぎると結論付けていると思います。私はこれが奇妙な単体テストに役立つことがわかりました。 –

1

あなたはComplexClassメンバーのコピーを作る値でメンバーを返します。したがって、後続のメソッド(およびコンパイラがあなたに伝えているもの)を呼び出すときには、実際のメンバで作業しているわけではありません。

私はカプセル化を維持するのに役立ちますし、カップリングを減少させ、より慣用的なC++のアプローチは、アルゴリズムのメンバーを作成することだと思います

A::doStuff() 
{ 
    member1.getSomething(); 
    member1.getSomethignElse(); 
} 

この方法でclass Aを使用して、誰もがしないの実装がComplexClassを使用していますケア代わりにAに何らかの作業を伝えることができることを知っていて、最良の方法で完了します。

コメントの編集:この場合、のメソッドを作成してComplexClassの値を取得することをお勧めします。それが適切でない場合は、const参照によって実装を返すことができます。const ComplexClass& getMember1() const { return member1; }

+0

これは良い方法ですが、この場合は有効なオプションではありません。私が書いたように、私はmember1からデータにアクセスしたいが、それには作業を実装しない。 –

関連する問題