我有以下代码,有一个'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'尚未在eyebrow.h中的void setExpression(Face :: Expression_e)中声明。
然后我转发声明的Face(见下文)并得到编译器错误:'face :: Expression'尚未在void setExpression(Face :: Expression)中声明;在eyebrow.h
eyebrow.h(带前瞻性声明):
#include "face.h"
class Face;
class Eyebrow {
public:
void setExpression(Face::Expression);
};
如果使用朋友,推荐的解决方法是什么?
答案 0 :(得分:4)
您已创建循环依赖项:
face.h包括eyebrow.h和eyebrow.h包括face.h,因此它们相互包含在内。您必须解决循环依赖关系。
您可以从Face中删除枚举并将其放入自己的头文件中,然后可以包含这两个文件。
或者,您可以存储指向眉毛而不是眉毛本身的眉毛指针。然后你可以在face.h中删除eyebrow.h的包含,然后转发eye-eyere眉毛。然后可以在Face的构造函数中初始化指针。