C++ 组合类c+的访问成员+;

C++ 组合类c+的访问成员+;,c++,forward-declaration,object-composition,C++,Forward Declaration,Object Composition,我有下面的代码,有一个由“眉毛”类组成的“脸”类。可以将面的表达式更改为允许的公共枚举之一,从而控制如何更改其每个组成部分。每个组成类都应该负责响应一个已更改的表达式,这就是为什么我要将它传递给每个组成类 面h: #include "eyebrow.h" class Face { public: enum Expression {NEUTRAL, JOY, ANGER}; void setExpression(Expression); privat

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

面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);
}
眉毛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)中声明在眉毛.h中

然后我转发声明的面(见下文),并得到编译器错误:“Face::Expression”未在void setExpression(Face::Expression)中声明;在眉毛上

眉毛h(带向前声明):


如果使用朋友,建议采用什么方法解决此问题?

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

脸。h包括眉毛。h和眉毛。h包括脸。h,所以他们互相包括。必须解决循环依赖关系

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


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

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

脸。h包括眉毛。h和眉毛。h包括脸。h,所以他们互相包括。必须解决循环依赖关系

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


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

我选择了第二个选项,因为我想在逻辑上保持Face类中包含的Face表达式。现在正在编译,我会把你的答案标记为已接受。谢谢。我选择了第二个选项,因为我想在逻辑上保留face类中包含的face表达式。现在正在编译,我会把你的答案标记为已接受。谢谢
#include "face.h"

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