2016-07-26 11 views
0

派生クラスのポインタへの参照(または可能でない場合はポインタ)を基本クラスAに入れたいと考えています。 これは次のようになります。データのクラスがあることで派生クラスのポインタへの基本クラスの参照

BaseClassController 
     { 
      public : 
      //Constructors, destructor,... 

      protected : 
      BaseDataClass *& m_current; 
     } 

DerivedClassAController : public BaseClassController 
    { 
     public : 
     //Constructors, destructor,... 

     protected : 
     DerivedDataClassA * m_currentA; 
    } 

DerivedClassBController : public BaseClassController 
    { 
     public : 
     //Constructors, destructor,... 

     protected : 
     DerivedDataClassB * m_currentB; 
    } 

BaseDataClass 
{ 
    void doSomething(); 
} 

DerivedDataClassA : public BaseDataClass 
{ 
//... 
} 

DerivedDataClassB : public BaseDataClass 
{ 
//... 
} 

私はBaseClassControllerで次に何をしたいのは何がある:

BaseClassController::someFunction(){ 
    m_current->doSomething(); 
} 

問題があることですm_currentAとm_currentBが指し示すオブジェクトは、プログラムの存続期間を通して大きく変化するでしょう。そして、m_current参照が自動的に変更されるようにしたいと思いますedクラスのポインタが変更されます。これを好き

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){ 
    m_currentA = ptA; 
} 

をしていない: Concretlyが、私はこのように見えるようにm_currentAが指すオブジェクトを変更する機能を希望

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){ 
    m_currentA = ptA; 
    m_current = ptA; 
} 

私は、派生クラスのコンストラクタにポインタを渡してみました:

BaseClassController::BaseClassController(BaseDataClass* pt) 
: m_current(pt) 
{ 
} 

DerivedClassAController::DerivedClassAController() 
: BaseClassController(m_currentA), 
    m_current(A) 
{ 
} 

しかし、私は、DerivedClassAControllerのDerivedDataClassBを指すm_currentを持っていました。

これは有効ですか?それとももっと良い方法がありますか?

注: DerivedClassAController時間のDerivedDataClassA 95%m_currentAを使用します。基本クラスでm_currentポインタだけを使うと、どこにでもdynamic_cast(m_current)が置かれます。

+0

「多型」 - 試してみましたか?あなたは 'm_current'ポインタを使って必要なものすべてを行うことができますか? – LogicStuff

+4

'仮想BaseDataClass * GetCurrent()= 0;'を 'BaseClassController'に追加し、2つの派生コントローラがそれを実装して、それぞれ' m_currentA'または 'm_currentB'の現在の値を返します。 –

+0

LogicStuff - 理由を説明するためにメモを追加しました。イゴール - そうすることができます!試してみます。しかし、私が試したように動作するかどうかを知りたい場合は、 – ElevenJune

答えて

1

私はアプローチを以下が働くだろうと思います:、代わりにメンバーのリファレンスを使用するポインタのコピーを返しますBaseClassControllerで仮想関数を作成:

struct BaseClassController { 
    virtual BaseDataClass* m_current() = 0; 

をそして、それぞれの派生コントローラで異なるそれを実装:

BaseDataClass* DerivedDataClassA::m_current() { 
    return m_currentA; 
+0

...可能であれば、そのポインタを使用する必要があるコードを**オブジェクト内部またはその親の内部に置いて、返す必要はないようにしてくださいまったくポインタ。そうすれば、特定のことが操作されているすべての方法を発見するために、「アプリケーションのソースコード全体を実行する必要はありません。もし何かを変えなければならないのであれば、それは「一度、ここに」変更する必要があります。 –

+0

可能な限り私がやることです。開発されたアプリケーションはCADですコントローラは、多くのMVCデザインパターンを使用します。コントローラはポインタを介してデータクラスを操作しますが、プログラムの残りの部分はコントローラの関数を呼び出します。ポインタはコントローラクラスとその基本クラスから離れていません。 – ElevenJune

関連する問題