Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Включение файлов C++.

#g++ #cpp


Есть два класса Figure и BaseCell (виртуальный). В BaseCell есть метод, принимающий
указатель на Figure, который должен использовать методы Figure. А в Figure есть член
класса с указателем на BaseCell. 
Как заинклюдить файлы BaseCell.h и Figure.h, что бы все работало? Компилятор g++.    


Ответы

Ответ 1



Твоя проблема в том, что каждый класс должен уже знать друг о друге, чтобы уметь как-то обращаться. "В тупую" пытаясь заинклудить друг друга, мы получаем бесконечное погружение в рекурсивное включение (или не получаем - компилятор не позволит). Т.к. ты используешь лишь указатели, тебе пригодится "Forward declaration". В заголовочных файлах предварительно заявляешь: "Потом будет описан такой-то класс, пока знай только то, что он будет". Компилятор не будет знать точного размера этого сумеречного класса (невозможно выделить для него память) и его членов (невозможно определить смещение внутри класса). Таким образом, все, что ты можешь - это работать с указателем на "некий класс". Ограничения те же, как и в void*, учитывая лишь то, что присваивать ему абы что нельзя. А в соответственных *.cpp файлах класса, уже приинклуживай необходимые файлы и сможешь обращаться к членам, создавать конкретные объекты (выделять память, как статически, так и динамически, ибо класс уже будет описан, а не только объявлен). // Figure.h class BaseCell; class Figure { BaseCell *ptr; public: int UseOtherClass(BaseCell* ptr); }; // BaseCell.h class Figure; class BaseCell { Figure *ptr; public: int UseOtherClass(Figure* ptr); }; // Figure.cpp #include "Figure.h" #include "BaseCell.h" int Figure::UseOtherClass(BaseCell* ptr) { // действия с указетелем и возврат необходимого типа } // BaseCell.cpp #include "BaseCell.h" #include "Figure.h" int BaseCell::UseOtherClass(Figure* ptr) { // действия с указетелем и возврат необходимого типа } Ну и, конечно, все методы (в т.ч. inline), в которых используется нечто большее, чем указатель на зависимый класс, должны определяться ПОСЛЕ полного объявления этого класса (в нашем случае - в cpp, после инклудов).

Комментариев нет:

Отправить комментарий