![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Account |
![]()
Сообщение
#1
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Есть вот такая программа.
По меню по очереди можно вывести бабочку, потом шестиугольник правильный, потом комбинированно бабочку в шестиугольнике. Бабочки и шестиугольник наследники от общего класса фигуры, а вот комбо от бабочки и шестиугольника. Не пойму вот следующее по идее класс Combo должен ведь унаследовать методы Move и SetNewColor, так как он наследник от Butterfly и Hex, которые в свою очередь наследуют данный метод от Figure. Но если выкинуть эти методы как сделано в выше представленном коде и напрямую обращаться например F3.SetNewColor(color);F3.Move(10*direction,10*direction); естественно компилятор материться. Так как правильно оформить наследственность и добраться до данных методов, не прописывая их в классе Combo и естественно не описывая так void Combo::Move(int x) P.S. Как в спойлер код скрывать, а то как то не красиво длинный пост получается? |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
А теперь еще раз: что выкинуть? Где компилятор матерится? Что ты не хочешь описывать? Приведи тот код, который, как ты думаешь, должен компилироваться, но он не компилируется...
А то на данный момент вообще не понятно, что же тебе в приведенном коде не нравится... Цитата Как в спойлер код скрывать Сделать [ hide="Заголовок спойлера" ]Текст спойлера[ /hide ]Только теги - без пробелов... Сообщение отредактировано: IUnknown - 4.07.2011 18:35 |
Account |
![]()
Сообщение
#3
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
IUnknown, описание класса Combo
class Combo:public Hexe,public Butterfly сами методы void Combo::Show() преподаватель говорит зачем создавать методы void Hide(); void Move(int x); void SetNewColor(int colr); у данного класса, ведь они наследуются. Вот мне интересно как их использовать без создания а по наследству, ведь если их убрать из описания класса, а потом попробовать обратиться напрямую, как обращаешься например F1.Move или F2.Move (F1 -Butterfly, F2- Hex), вот так F3.Move тогда компилятор ругается. Я так понимаю потому что данный класс не прямой потомок от класса Figure ? Сообщение отредактировано: Account - 4.07.2011 19:07 |
IUnknown |
![]()
Сообщение
#4
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата преподаватель говорит зачем создавать методы void Hide(); void Move(int x); void SetNewColor(int colr); у данного класса, ведь они наследуются. Вот мне интересно как их использовать без создания а по наследству Преподаватель в своем уме? При множественном наследовании методов (да еще и виртуальных) с одинаковыми именами и с одной областью видимости (они все описываются в public-разделе, и наследование всегда общее, то есть все они видимы в потомках) возникает неоднозначность, которую компилятор не имеет права разрешать. Скажем:#include <iostream>Так что даже не выдумывай, без переопределения в классе Combo этой "прослойки" не обойдешься. Кстати, Липпман именно такой способ называет хорошим тоном программирования. Но у тебя есть еще одна загвоздка. Еще раз смотри: (Показать/Скрыть)
Оно тебе надо, чтоб базовый класс инициализировался 2 раза? Не надо. Решение: (Показать/Скрыть)
|
Account |
![]()
Сообщение
#5
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
|
sheka |
![]()
Сообщение
#6
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
т.е. на всякий случай лучше всегда делать виртуальное наследование?
|
IUnknown |
![]()
Сообщение
#7
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата т.е. на всякий случай лучше всегда делать виртуальное наследование? На всякий случай надо знать об этом подводном камешке. И поступать так, как тебе нужно для решения задачи. Иногда (правда редко) нужно, чтобы при множественном наследовании базовый класс инициализировался при инициализации каждого потомка, иногда (чаще всего) не нужно. Поэтому, если ты будешь знать эту особенность - сможешь делать так, как нужно в твоем случае... |
Account |
![]()
Сообщение
#8
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Кстати, столкнулся еще с проблемой такой, что остаются следы после передвижения и именно от линий. Вот когда баловался выводил окружность, эллипс и двигал все нормально, как только появляются линии. при движении остаются следы, будто не стирается. Вот на примере выше, бабочка еще нормально, но шестиугольник и комбинированная фигура. при движении оставляет следы. В чем проблема и как от нее избавиться?
|
IUnknown |
![]()
Сообщение
#9
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот кстати, без виртуального наследования следы однозначно будут оставаться при движении объекта типа Combo. Причем не только от линий, а и от эллипсов, то есть, объект будет просто напросто некорректно перерисовываться. Именно потому, что не надо второй раз инициализировать Figure... Рисоваться и стираться будут разные объекты. Как только ты сделаешь наследование виртуальным - этот глюк пропадет, объект Figure останется только один...
А насчет как избавиться от следов линий - не знаю, Wine запускать лениво, да и компилятор TurboC я уже стер... Теоретически - если ты уверен, что это линии "недоудаляются" - попробуй при стирании ставить бОльшую толщину линии (не NORM_WIDTH, который 1, как обычно, а THICK_WIDTH, который = 3). То есть, перед удалением установи через setlinestyle толстую линию, а потом, перед отрисовкой - опять обычную, узкую... |
Account |
![]()
Сообщение
#10
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
IUnknown, добавил виртуальное наследование к бабочке и шестиугольнику, но компилятор ругается в конструкторе Combo на то что не найден конструктор для инициализации базового класса Figure (с английским у меня плохо, но что то в этом роде)
|
IUnknown |
![]()
Сообщение
#11
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата но компилятор ругается в конструкторе Combo на то что не найден конструктор для инициализации базового класса Figure ![]() Сначала - как это происходит при наследовании обычном: class base { , то есть, тебе было достаточно в списке инициализации написать только инициализацию тех классов, от которых ты наследовался, а уже они сами будут вызывать конструктор СВОИХ предков... Более того, тебе было запрещено писать в списке инициализации C() конструктор base, потому что ты от него напрямую не наследовался... В случае с виртуальным базовым классом такой вариант не проходит. Класс C должен содержать одну копию base, поэтому надо инициализировать виртуальный базовый класс в наиболее удаленном от него потомке (чтоб потом не спрашивать себя, а откуда же был инициализирован базовый класс, из A или из B?). У тебя наиболее удаленный - не Hexe и не Butterfly, а Combo. Компилятор при виртуальном наследовании ждет инициализации не только Hexe + Butterfly, но и инициализации Figure. Если ты не записываешь его конструктор в список инициализации - будет вызван дефолтный конструктор (без параметров). У тебя и его нет, компилятор старый, не создает конструкторов самостоятельно. Надо добавить инициализацию ручками (все равно ты и в Hehe и в Butterfly одинаково вызываешь конструктор Figure): class Combo : public Hexe, public Butterfly , теперь компилятор знает, чем инициализировать базовый класс, и проблем не будет... Сообщение отредактировано: IUnknown - 5.07.2011 18:03 |
Account |
![]()
Сообщение
#12
|
Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 212 Пол: Мужской Репутация: ![]() ![]() ![]() |
Очередной раз спасибо за разъяснение. Учусь на заочном отделении, а там преподаватели не учат, а в лучшем случае если повезет могут дать консультацию.
|
![]() ![]() |
![]() |
Текстовая версия | 16.07.2025 21:41 |