2013-07-15 3 views
0

Это мой первый пост на StackOverflow так нежна :)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; 
}; 

Компилятор дает мне ошибки:

неоднозначное доступа 'Текст'

неоднозначной доступа 'Focused'

Но все, что я want - это те переменные из всех классов, которые должны быть объединены в производном классе «Текстовое поле».

Here's link to the UML picture with the problem

Спасибо за любую помощь Sorry для любых языков ошибок и/или вопрос, который я задаю.

Update

Небольшое пояснение, потому что я, возможно, использование неправильных слов. Простите за это.

Под «слиянием» я имел в виду, что:

  • Если я использую переменные или методы Control, Caption или Frame это будет влиять на значения 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

Возможный дубликат [Незначительное классовое наследование] (http://stackoverflow.com/questions/12793651/ambiguous-class-inheritance) – Mgetz

ответ

0

Примечания:

  1. Рассматривают с помощью mutator methods
  2. Пожалуйста http://sscce.org/ - ваш пример кажется немного над шоу - будет проще дать вам четкий пример того, как решить вашу проблему, если ваш пример в проблеме был infact sscce. В любом случае, его все еще достаточно, и ваша проблема достаточно ясна, я думаю.

Ответы:

  1. Почему class TextEditor также не унаследуют от class Control и class Caption? Это похоже на очевидное решение - вам все равно придется использовать виртуальное наследование для class TextBox.
  2. Если 1 не является вариантом - тогда есть это - но в этом ограниченном примере HasText и Focusable кажется бессмысленным по сравнению с Caption и Control соответственно.

    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

Второй вариант потребует от меня перепроектировать весь API GUI. В моем случае первый вариант также не может быть использован. Поэтому единственное, что для меня - это дублирование кода TextEditor, разделите его на части, чтобы он мог наследовать 'Caption'. Я хотел избежать этого, но когда-нибудь вам нужно сделать шаг назад, чтобы двигаться вперед. В любом случае спасибо за ваши идеи и помощь :) – Lavi

+0

Если вы использовали методы мутаторов, все это также могло бы предоставить опцию. –

Смежные вопросы