[英]Access member of composition class c++
我有以下代码,有一个'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)
我收到以下编译器错误:eyebrow.h中的void setExpression(Face :: Expression_e)中未声明“ Face”。
然后,我转发声明的Face(请参见下文),并得到编译器错误:尚未在void setExpression(Face :: Expression)中声明'Face :: Expression'; 在眉毛中
eyebrow.h(带有前向声明):
#include "face.h"
class Face;
class Eyebrow {
public:
void setExpression(Face::Expression);
};
建议使用什么方法解决此问题,应该使用朋友吗?
您已经创建了循环依赖项:
face.h包含eyebrow.h,而eyebrow.h包含face.h,因此它们彼此包含。 您必须解决循环依赖关系。
您可以从Face中删除该枚举,然后将其放在自己的头文件中,然后两个文件都可以包含该头文件。
或者,您可以在Face中存储指向Eyebrow的指针,而不是Eyebrow本身。 然后,您可以删除face.h中的eyebrow.h包含,并改为向前声明Eyebrow。 然后可以在Face的构造函数中初始化指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.