Это мой первый пост на 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.
Спасибо за любую помощь
Извините за любые языковые ошибки и / или вопросы, которые я задаю.
Обновить
Небольшое объяснение, потому что я мог бы использовать неправильные слова. Простите за это.
Под «слиянием» я имел в виду следующее:
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";
С наилучшими пожеланиями
Лави
Заметки:
ответы:
class TextEditor
не наследовать от class Control
а также class Caption
? Казалось бы, очевидное решение — вам придется использовать виртуальное наследование для class TextBox
все же хотя.Если 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 { };
Других решений пока нет …