2012-03-21 8 views
0

誰かがGUIインターフェイスからネストされたオブジェクトを編集するのに役立つデザインを持っているのだろうかと思います。メンバーアクセスデザイン(メンバーのメンバーへのアクセス)

は、私は今、私はObjectBにへのアクセス権を持っていますが、私は本当にGUIからのParamを設定する必要があるとし、二つのクラス

class ObjectA 
{ 
    public: 
     ObjectA() 
     ~ObjectA() 

     unsigned GetParam(); 
     void SetParam(unsigned Param) 

    private: 
     unsigned Param; 
}; 

class ObjectB 
{ 
    public: 
     ObjectB() 
     ~ObjectB() 

     ObjectA GetObjectA(); 
     void SetObjectA(ObjectA ObjA) 

    private: 
     ObjectA ObjA; 
}; 

を考えてみましょう。私はこれを行うために見ることができる2つの方法があります。

  1. 使用アクセサとミューテーターは

    ObjectA ObjA = ObjB.GetObjectA(); 
    ObjA.SetParam(100); 
    ObjB.SetObjectA(ObjA); 
    
  2. は、彼らが伴うので、私は本当にこれらのソリューションを好きではない

    void ObjectB::SetParam(unsigned Param) 
    { 
        ObjA.SetParam(Param); 
    } 
    

ObjectBに

にパブリックインターフェイスを追加したオブジェクトを編集します多くのコードを記述すると、オブジェクトのパラメータにアクセスしたり、うまく拡張できません。助言がありますか?

+2

class ObjectA { public: ObjectA() ~ObjectA() unsigned GetParam(); void SetParam(unsigned Param) private: unsigned Param; }; class ObjectB { public: ObjectB() ~ObjectB() ObjectA* GetObjectA(); void SetObjectA(ObjectA *ObjA) private: ObjectA *ObjA; }; ObjectA *ObjA = ObjB.GetObjectA(); ObjA->SetParam(100); 
あなたは別の一つの基準としてオブジェクトを返す場合、あなたは 'ObjB.GetObjectA()SETPARAM(100)を使用することができ;'。 –

答えて

0

コピーコンストラクタの処理を避けることが容易になり、ObjectAの内部にさらに多くの関数がある場合、ObjectBクラスで同じ関数を持つ必要があるかもしれないので、objAをオブジェクトではなくポインタとして作成することをお勧めします例:SetParamのようにGetParamを実装する必要があるかもしれません。

この関数はそれぞれのクラスの責任であり、コンテナクラスの責任ではありません。

+0

'public'メソッドで公開したいだけの場合は、' ObjA'、 'private'を作る意図は何ですか?それはそれを '公的に保つことと同じくらい良いことです。 –

+0

公開すると、制限なしで新しいものを削除することができます。それをプライベートにすることで、コンテナクラスのあるレベルの制御が可能になります。 – Jeeva

+0

あなたのソリューションはコピーコンストラクターの問題に対処するのがいいです。何が私を怖がらせるのは、私のクラスを使用している誰かが、非constデータにアクセスできるようになりました。 そこにデザインパターンがあることを期待していたと思いますが、編集者のデータにアクセスするために人々が使用することに気づいていませんでした。たぶん希望的な考え。 – MSTEVENS

関連する問題