访问组合类c ++的成员

时间:2018-03-22 17:30:07

标签: c++ forward-declaration object-composition

我有以下代码,有一个'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);
};

如果使用朋友,推荐的解决方法是什么?

1 个答案:

答案 0 :(得分:4)

您已创建循环依赖项:

face.h包括eyebrow.h和eyebrow.h包括face.h,因此它们相互包含在内。您必须解决循环依赖关系。

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

或者,您可以存储指向眉毛而不是眉毛本身的眉毛指针。然后你可以在face.h中删除eyebrow.h的包含,然后转发eye-eyere眉毛。然后可以在Face的构造函数中初始化指针。