2013-07-15 57 views
0

共享變量這是我的計算器上的第一篇文章,所以要溫柔:)C++鑽石傳承 - 與其他非基本類

我有標準的鑽石的問題,但我會設法把它整理出來。

class Control 
{ 
    public: 
    bool Focused; 
}; 

class Caption : public virtual Control 
{ 
    public: 
    string Text; 
}; 

class Frame : public virtual Control { }; 

class Textbox : public Caption, public Frame, public TextEditor { }; 

遺憾的是,繼承問題出現了另一個問題。 TextEditor類有共同的變量名:

class TextEditor 
{ 
    public: 
    bool Focused; 
    string Text; 
}; 

編譯器給我的錯誤:

'文本'

'聚焦'

但所有我的曖昧訪問的曖昧訪問希望是來自所有類的變量在派生類「文本框」中合併。

Here's link to the UML picture with the problem

感謝任何形式的幫助 對不起任何語言錯誤和/或問題我問。

更新

一點解釋,因爲我可能會使用錯誤的話。對不起。

通過「合併」我的意思是:

  • 如果我使用的變量或ControlCaptionFrame方法也將影響TextEditor值,反之亦然。換句話說,變量在派生類中共享。

所以我最後的類將是這樣的:

class Textbox : public Caption, public Frame, public TextEditor 
{ 
    public: 
    string Text; 
    bool Focused; 
}; 

,而不是像這樣:

class Textbox : public Caption, public Frame, public TextEditor 
{ 
    public: 
    string Caption::Text; 
    bool Caption::Focused; 
    string TextEditor::Text; 
    bool TextEditor::Focused; 
}; 

現在哪個發生。原因我不能這樣做:

Textbox A; 
A.Text = "Text"; 

因爲我有兩個變量名爲Text。所以,我必須這樣做:

Textbox A; 
A.Caption::Text = "Text"; 
A.TextEditor::Text = "Text"; 

問候 拉比

+2

請仔細閱讀http://stackoverflow.com/help/how-to-ask – Mgetz

+0

其中的 '怎樣問' 點我違反?問題是具體的。我已經通過互聯網重新討論了這個問題還有什麼? – Lavi

+0

[Ambiguous類繼承]的可能重複(http://stackoverflow.com/questions/12793651/ambiguous-class-inheritance) – Mgetz

回答

0

注:

  1. 考慮使用mutator methods
  2. http://sscce.org/ - 您的例子似乎有點過表演 - 會如果你的例子在問題中事實上很嚴重,那麼更容易給你一個清楚的例子,說明如何解決你的問題。無論哪種方式,它仍然是足夠的,我想你的問題已經足夠清楚了。

答案:

  1. 爲什麼class TextEditor不也是從class Controlclass Caption繼承?這看起來像是一個明顯的解決方案 - 但您仍然必須爲class TextBox使用虛擬繼承。
  2. 如果1不是一個選項 - 那麼就是這樣 - 但是在這個有限的示例中,與標題和控件相比,HasText和Focusable似乎毫無意義。

    class HasText 
    { 
    public: 
        virtual string& text() { return text; } 
        virtual const string& text() const { return text; } 
    private: 
        text 
    }; 
    
    class Focusable 
    { 
    public: 
        virtual bool& focused() { return focused; } 
        virtual const bool& focussed() const { return focussed; } 
    }; 
    
    class Control : public virtual Focusable { }; 
    
    class Caption : public virtual Control, public virtual HasText { }; 
    
    class Frame : public virtual Control { }; 
    
    class TextEditor : public virtual HasText, public virtual Focusable { }; 
    
    class Textbox : public virtual Caption, public virtual Frame, public virtual TextEditor { }; 
    
+0

第二個選項需要我重新設計整個GUI API。在我的情況下,第一個選項也不能使用。所以對我來說,唯一的辦法就是重寫'TextEditor'的代碼,將它分開,這樣它就可以繼承'Caption'。我想避免這種情況,但有時需要退後一步才能繼續前進。無論如何感謝您的想法和幫助:) – Lavi

+0

如果你在整個這個過程中使用了mutator方法,可能也提供了一個選項。 –