C ++ Diamond Inheritance — делится переменными с другим не базовым классом

Это мой первый пост на stackoverflow, так что будьте осторожны 🙂

У меня стандартная проблема с бриллиантами, но мне удалось ее решить.

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»

Но все, что мне нужно, — это чтобы переменные из всех классов были объединены в производный класс Textbox.

Вот ссылка на картинку UML с проблемой

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

Обновить

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

Под «слиянием» я имел в виду следующее:

  • Если я использую переменные или методы 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";

С наилучшими пожеланиями
Лави

0

Решение

Заметки:

  1. Рассмотреть возможность использования методы мутатора
  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

Другие решения

Других решений пока нет …