![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| devmstr |
|
||||||||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
Есть Базовый класс(Base.h):
Его первый потомок:
Его второй потомок:
Главный модуль:
И тут компилер начинает страшно ругатся на Base, типа redefinition и т.д.. Как я понимаю проблема заложена в том что в Class1.h и в Class0.h есть строка #include "Base.h", но как это решить я уже не помню... -------------------- Think different ©Steve Jobs ![]() |
||||||||
|
|||||||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Добавь защиту от множественного инклюда, т.е. во все *.h
-------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
или
|
|||
|
||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
Sartorius,
Спасибо! Помогло! nickless, А не могли бы Вы мне подробнее рассказать, как я могу это использовать в моем примере. Хотелось бы узнать и этот способ. Сам механизм вроде понятен, если хидер еще не добавлен, то добавить, иначе нет. Но как реализовать это в данном примере. Например знаяЮ что в main уже включен Base.h, посредством #include "Class0.h", я не могу не добавить Class1.h, т.к. мне нужен доступ к классу Class1. Если Вас не затруднит, обясните, пожалуйста... -------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
| VectorMan |
|
|||
|
Antihero ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 9.4.2006 Репутация: 1 Всего: 4 |
devmstr, сделай такую обёртку для base.h, тогда при подключении class1.h заголовок с базовым классом не будет подключён второй раз
Это сообщение отредактировал(а) VectorMan - 12.12.2006, 09:04 |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
А в данном случае просто учитыванием порядка инклудов не получится выйти из ситуации? То есть выбросить #include "base.h" из файлов потомков и вставить эту строчку в main перед #include "Class1.h" и #include "Class0.h"? Точно так же можно из файлов потомков выкинуть #include <windows.h>, так как он потом один раз уже инклудится в main.
Это сообщение отредактировал(а) Xenon - 12.12.2006, 09:31 |
|||
|
||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
ЭЭ, это ссылка на этот же топик -------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
| VectorMan |
|
|||
|
Antihero ![]() Профиль Группа: Участник Сообщений: 110 Регистрация: 9.4.2006 Репутация: 1 Всего: 4 |
Это ссылка на пост, вообще-то
|
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
VectorMan, надо было просто процитировать
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
это решение, но плохое в таком случае классы получатся несамодостаточные - корректность будет зависеть от того, что подключат до него, это приведёт к сложности использования (гораздо проще пользоваться чем-то, что требует простого #include одного файла, который уже разберётся, что ему надо, а что - нет) - так получается, что пользователю Class0 нужно знать, какие заголовки ему нужны... лучше всего, когда заголовочный файл подключает все необходимые ему #include'ы -------------------- qqq |
|||
|
||||
| Xenon |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1529 Регистрация: 12.4.2006 Репутация: 11 Всего: 50 |
maxim1000, то есть лучше #pragma once делать, а инклудить все, что тебе нужно в ТЕКУЩЕМ интерфейсе?
|
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
да (касательно #pragma once - я предпочитаю #ifndef/#include: он работает на всех компиляторах, а #pragma - зависит от компилятора) -------------------- qqq |
|||
|
||||
| nickless |
|
||||||||||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Вообще, лучше чтобы выработался рефлекс, начинать все хедеры с
Если в каждом хедере будет страж, то проблем с множественными инклюдами больше не будет. Т.е. в этом случае: Base.h
Class0.h
Class1.h
Это сообщение отредактировал(а) nickless - 12.12.2006, 20:02 -------------------- ![]() Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies - Linus Torvalds |
||||||||||
|
|||||||||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
nickless
Большое спасибо за пример. Но я все же никак не могу понять логику В каждом заголовочном файле мы объявляем "именную константу" если она до этого не была объявлена и компилируем код до конца файла. Но в чем смысл этого? Как рассуждает компилятор?? Почему мы это должны делать для всех файлов. Я понимаю что это действительно актуально для Base.h, я на него ссылаюсь два раза, но зачем аналогичные действия для Class0 и Class1. Вначале я думал, что это на будущее, что бы не было конфликтов далее. Но без таких же "обверток" код не компилится. Вот это я и не могу понять. -------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
| devmstr |
|
|||
![]() Developer ![]() ![]() Профиль Группа: Участник Сообщений: 879 Регистрация: 28.4.2004 Где: Ukraine Репутация: нет Всего: 11 |
Мой глюк, все уже нормально.
-------------------- Think different ©Steve Jobs ![]() |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |