2016-07-26 69 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引用在deriv編輯類指針改變。 較具體來說,我想功能改變由m_currentA指向的對象是這樣的:

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

,而不是像這樣:

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) 
{ 
} 

但我最終有一個m_current指向DerivedClassAController中的DerivedDataClassB。

這是不可能的嗎?或者有更好的方法來做到這一點?

注意: DerivedClassAController將使用m_currentA作爲DerivedDataClassA 95%的時間。在基類中只使用m_current指針將結束在每個地方放入dynamic_cast(m_current)。

+0

'多態性' - 你試過了嗎?你能通過'm_current'指針做你需要的一切嗎? – LogicStuff

+4

'BaseClassController'中的virtual BaseDataClass * GetCurrent()= 0;並且讓兩個派生控制器分別實現它並返回當前值'm_currentA'或'm_currentB'。 –

+0

LogicStuff - 我添加了一個註釋來解釋爲什麼我不能像你所建議的那樣做。伊戈爾 - 這可以工作是的!我會嘗試。但我也想知道它是否可以按照我嘗試的方式工作 – ElevenJune

回答

1

我認爲,以下方法是有效的:除了使用成員引用,創建BaseClassController虛函數,返回指針的副本:

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

而且在每個派生控制器不同的方式實現它:

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

......並且,我建議,只要有可能,就把需要*使用*這個指針的代碼放到**對象本身或其父代的內部,這樣就不需要返回一個指針。這樣,「我不必跑遍所有的應用程序的源代碼」來發現一個特定的東西被操縱的所有方式。 「如果(或者更確切地說,* when)*某件事情需要改變,只需要改變一次,」在這裏。「 –

+0

這就是我在可能的情況下做的事情。開發的應用程序是CAD使用了大量的MVC設計模式,Controller通過一個指針操縱數據類,但程序的其餘部分調用Controller的函數,指針不會遠離控制器類及其基類。 – ElevenJune

相關問題