C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
#include — как грамотно пользоваться?, компилер постоянно ругается на видимость
** ariks
Отправлено: 26.04.2004, 10:47


Не зарегистрирован







Будте добры, подскажите как правильно воспользоваться диррективой #include.
Я чего то не допонимаю. Компилятор постоянно ругается то он такой то класс не видит, то такой то.
А я уже всё что можно инклайдами и предварительными объявлениями утыкал, а не помогает sad.gif.



//---------------------------------------------
// AppController.h
class AppController /* центральный объект. создаёт остальные модули. предоставляет интерфейс для межмодульного взаимодействия. */
{
WndController mWndCtrl; // оконный менеджер
};
extern AppController & theApp; // глобальная ссылка на единственный объект контроллера приложения

class View // абстрактный базовый класс представления (вида)
{
public:
virtual View* Make()=0;
};
// end AppController.h
//---------------------------------------------
// WndCtrllr.h
class WndController
{
MainView mMainView;
};
// end WndCtrllr.h
//---------------------------------------------
// MainForm.h
class TMainForm // главное окно(форма)
{
IMainView *mIMainView;
};

class MainView : public View /* главное представление (только через него можно обращаться к гл.форме */
{
TMainForm *mMainForm;
};

class IMainView /* УмныйУ казатель (интерфейс) на гл.вид*/
{
MainView *mMainView;
};
// end MainForm.h
//---------------------------------------------

//есть ещё WinMain
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Application->Initialize();
theApp.InitInstance();
Application->Run();
return 0;
}
olegenty
Отправлено: 26.04.2004, 12:14


Ветеран

Группа: Модератор
Сообщений: 2412



инклуды-то приведи...
Deem
Отправлено: 29.04.2004, 09:49


Мастер участка

Группа: Участник
Сообщений: 327



Знаешь, что скобки <...> и "..." различаются?
Знаешь, что .h файлы надо на всякий случай обрамлять условной компиляцией #ifndef ... #endif ? После такого обрамления .h — файл можно инклюдить куда угодно и сколько угодно раз. Препроцессор вставит его текст в cpp только один ПЕРВЫЙ раз.
Знаешь, что любой идентификатор можно использовать в модуле только после его описания? А порядок следования инклюдов может приводить к ошибке?
olegenty
Отправлено: 30.04.2004, 07:10


Ветеран

Группа: Модератор
Сообщений: 2412



Не-а, не знает, потому что иначе не было бы вопроса biggrin.gif
ariks
Отправлено: 07.05.2004, 23:52


Ученик-кочегар

Группа: Участник
Сообщений: 5



Да знаю я всё это (хотя про важность порядка инклайда лишь догадывался)

вообще получается просто циклеческая ссылка.

в 1м h файле в классах есть члены из 2h файла и наоборот.
А ещё есть другие h файлы.. которым надо видеть интерфейсы первых.
получается каша... А у Страуструпа не достатоно подробно это описано.

Вот попробую даже исходники приклеить сюда.

User Attached Image Скачать файл
Dragon_editor.rar


Deem
Отправлено: 11.05.2004, 15:09


Мастер участка

Группа: Участник
Сообщений: 327



Да, бывает кашка. Тут надо продумывать последовательность. Но при использовании условной компиляции можно вставлять inclide в другие .h, если они там нужны. И в другие места — тоже можно вставлять. Компилятор пущай разбирается.
А как хорошо в DELPHI! Скорость компиляции офигенная. Глазом не моргнешь, а уже откомпилил все. Я немного даже терялся. Компилил по несколько раз для верности. smile.gif

Кстати, классы, как и функции, можно описывать до определения.

class TYearRpt;

class My
{
TYearRpt* Y; // На такое поле компилер не матючится
void Do () { Y->Do(); } /* А на такую функцию матючится, т.к. класс еще не определен*/

};

class TYearRpt : public TForm
{
public:
void Do(){};
};

Короче, тут есть о чем поразмыслить. Кого, куда и за кем вставлять.






Вернуться в Аспекты и идеология профессиональной разработки ПО