簡體   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