私は以下のような2つのクラスを持っています。C++の別のクラスのクラスの複数のオブジェクトをカプセル化
class Hand
{
public:
func1();
func2();
...
func20();
private:
Hand();
~Hand();
Hand(const Hand& that);
void operator=(Hand const&);
friend class Body;
};
class Body
{
public:
Body();
~Body();
Hand * const &left_hand;
Hand * const &right_hand;
private:
Hand * _left_hand;
Hand * _right_hand;
};
Body::Body()
:left_hand(_left_hand)
:right_hand(_right_hand)
{
_left_hand = new Hand();
_right_hand = new Hand();
};
これはハンド/ボディの関係に従います。手は体に属します。 -
- ユーザーはHandオブジェクトを作成/削除できません。
- Bodyに属するHandオブジェクトのコピーを作成することはできません。
- ユーザーはBodyオブジェクトの左手と右手のポインタを変更できません。
しかし、私の同僚は、ユーザーがメンバーオブジェクトのメソッド(この場合はbody->left_hand->func1()
)を直接呼び出すことができないと言っています。
getter funtion(例:getLeftHand()
)を使用して、読み取り専用のパブリック変数left_handの代わりにHand * const
を返すことを提案しました。あなたが見ることができるように
もう一つは
class Body
{
Body();
~Body();
leftHandfunc1();
rightHandfunc1();
leftHandfunc2();
rightHandfunc2();
...
leftHandfunc20();
rightHandfunc20();
private:
Hand * _left_hand;
Hand * _right_hand;
};
そして
Body::leftHandfunc1()
{
_left_hand->func1();
}
などの各手の機能のためのラッパー関数を作成することでしたが、手の20個の方法は、体内の40のラッパー関数に等しいです。そして、このリストは成長すると予想されます。私はこのアプローチをとるべきでしょうか?
もっと良い選択肢はありますか?
抽象基底クラス(インタフェース)を導入して、 'Hand'の別個の作成とインタフェースはどうでしょうか? –
あなたの 'class body'は' private' memebrしか持っておらず、 'public'はそれが誤字ですか? – user463035818
体のインターフェイスを通して手のすべての機能を公開したい場合は、手だけを公開してください。 –