прямое объявление — доступ к элементу состава класса переполнения стека

У меня есть следующий код, есть класс «Face», который состоит из класса «Eyebrow». Выражение лица может быть изменено на одно из допустимых общедоступных перечислений, таким образом контролируя, как следует изменять каждую его составляющую. Каждый из составляющих классов должен отвечать за реагирование на измененное выражение, поэтому я хочу передать его каждому компоненту.

face.h:

#include "eyebrow.h"class Face {
public:
enum Expression {NEUTRAL, JOY, ANGER};
void setExpression(Expression);
private:
Eyebrow left_eyebrow;
}

face.cpp:

#include "face.h"#include "eyebrow.h"
void Face::setExpression(Expression e) {
left_eyebrow.setExpression(e);
}

eyebrow.h:

#include "face.h"
class Eyebrow {
public:
void setExpression(Face::Expression);
};

Код компилируется с помощью Cmake:

add_executable(Main main.cpp face.cpp eyebrow.cpp)

Я получаю следующую ошибку компилятора: «Face» не был объявлен в void setExpression (Face :: Expression_e) в eyebrow.h.

Затем я перенаправил объявление Face (см. Ниже) и получил ошибку компилятора: Face :: Expression не был объявлен в void setExpression (Face :: Expression); в брови

eyebrow.h (с предварительным объявлением):

#include "face.h"
class Face;
class Eyebrow {
public:
void setExpression(Face::Expression);
};

Каков рекомендуемый способ решения этой проблемы, если друзья будут использоваться?

0

Решение

Вы создали круговую зависимость:

face.h включает в себя eyebrow.h и eyebrow.h включает в себя face.h, поэтому они включают друг друга. Вы должны разрешить круговую зависимость.

Вы можете удалить enum из Face и поместить его в собственный заголовочный файл, который затем могут быть включены в оба файла.

В качестве альтернативы, вы можете хранить указатель на Бровь на лице вместо самой брови. Затем вы можете удалить включение eyebrow.h в face.h и вместо этого объявить бровь. Затем указатель может быть инициализирован в конструкторе Face.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]