Есть два класса 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, после инклудов).
Комментариев нет:
Отправить комментарий