Проблема в том, что C ++ объявляется перед использованием, поэтому любой тип должен быть объявлен перед использованием. (Где «до» означает «выше в исходном тексте».) Для типов с циклическими зависимостями это означает, что типы должны быть объявлены , прежде чем они могут быть определены . Это делается с помощью предварительного объявления , в котором просто вводится имя, без определения типа. В этом случае такая декларация будет class CDScreen;
.
(Обратите внимание, что после прямого объявления вы можете использовать указатели на тип, но не фактические объекты типа, поскольку он еще не определен.)
В отличие от Java, C ++ не требует, чтобы вы помещали каждый класс в отдельный файл. Фактически, часто предпочтительнее поместить группу классов, которые принадлежат / работают вместе, в один заголовочный файл.
В частности, в случаях, подобных вашему, с круговыми зависимостями, помещение каждого класса в отдельный заголовочный файл / модуль компиляции может оказаться довольно хрупким. Например, порядок, в котором пользователь включает заголовочные файлы, может иметь значение, что может привести к случайным ошибкам компиляции.
В вашем случае я бы сказал, что лучший вариант - поместить классы в один файл и добавить предварительные объявления вверху.
#include <stdint.h>
class CDScreen; // forward declarations
class CDFrame; // (this one is not strictly necessary but put in for symmetry/consistency)
class CDFrame {
public:
CDFrame(uint8_t capacity);
virtual ~CDFrame();
private:
uint8_t capacity = 0;
CDScreen* parent = nullptr; //<- Parent property of CDScreen class
}
class CDScreen {
public:
CDScreen(uint8_t capacity);
virtual ~CDScreen();
void addFrame(CDFrame* frame); // Sets the frame's parent (this CDScreen) when a new frame is added
private:
uint8_t capacity = 0;
uint8_t size = 0;
CDFrame** frames;
}