0

我有以下代码,有一个由“Eyebrow”类组成的“Face”类。面部表情可以更改为允许的公共枚举之一,从而控制每个组成部分的更改方式。每个组成类都应该负责响应更改的表达式,这就是为什么我想将它传递给每个组成部分。

脸.h:

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

脸.cpp:

#include "face.h"
#include "eyebrow.h"

void Face::setExpression(Expression e) {
     left_eyebrow.setExpression(e);
}

眉毛.h:

#include "face.h"

class Eyebrow {
    public:
         void setExpression(Face::Expression);
};

代码正在用 Cmake 编译:

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

我收到以下编译器错误:没有在brown.h 的void setExpression(Face::Expression_e) 中声明'Face'。

然后我转发声明的 Face(见下文)并得到编译器错误:'Face::Expression' has not been declared in void setExpression(Face::Expression); 在眉毛.h

brown.h(带有前向声明):

#include "face.h"

class Face;
class Eyebrow {
    public:
         void setExpression(Face::Expression);
};

有什么推荐的解决方法,朋友们应该用吗?

4

1 回答 1

5

你已经创建了一个循环依赖:

face.h 包含brown.h 和browser.h 包含face.h,所以它们相互包含。您必须解决循环依赖关系。

您可以从 Face 中删除枚举并将其放入自己的头文件中,然后两个文件都可以包含该头文件。

或者,您可以在 Face 中存储指向 Eyebrow 的指针,而不是 Eyebrow 本身。然后,您可以删除 face.h 中的brown.h 的包含并改为前向声明Eyebrow。然后可以在 Face 的构造函数中初始化指针。

于 2018-03-22T17:41:01.337 回答