繁体   English   中英

组成类C ++的访问成员

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM