Страницы

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

воскресенье, 14 апреля 2019 г.

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

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


Ответ

Твоя проблема в том, что каждый класс должен уже знать друг о друге, чтобы уметь как-то обращаться. "В тупую" пытаясь заинклудить друг друга, мы получаем бесконечное погружение в рекурсивное включение (или не получаем - компилятор не позволит). Т.к. ты используешь лишь указатели, тебе пригодится "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, после инклудов).

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

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