簡體   English   中英

引用超類(C ++)中的子類

[英]Refering to subclasses in the superclass (C++)

我的設計實施存在問題。 有一個超類定義方法,這些方法具有該超類的子類作為返回值。 如您所見:

#ifndef I_ATTITUDEDESCRIPTOR_H
#define I_ATTITUDEDESCRIPTOR_H

#include "cl_EulerAngles.h"
#include "cl_Quaternion.h"
#include "cl_RodriguesParameters.h"
#include "cl_RotationMatrix.h"
#include "cl_TransformationMatrix.h"

class i_AttitudeDescriptor {
    public:
        i_AttitudeDescriptor();
        virtual ~i_AttitudeDescriptor() = 0;

        virtual cl_EulerAngles* getEulerAngles(cl_EulerAngles* result) = 0;
        virtual cl_Quaternion* getQuaternion(cl_Quaternion* result) = 0;
        virtual cl_RodriguesParameters* getRodriguesParameters(cl_RodriguesParameters* result) = 0;
        virtual cl_RotationMatrix* getRotationMatrix(cl_RotationMatrix* result) = 0;
        virtual cl_TransformationMatrix* getTransformationMatrix(cl_TransformationMatrix* result) = 0;
    protected:
    private:
};

#endif // I_ATTITUDEDESCRIPTOR_H

子類之一例如由以下給出:

#ifndef CL_EULERANGLES_H
#define CL_EULERANGLES_H

#include "i_AttitudeDescriptor.h"

#include "cl_Quaternion.h"
#include "cl_RodriguesParameters.h"
#include "cl_RotationMatrix.h"
#include "cl_TransformationMatrix.h"


class cl_EulerAngles : public i_AttitudeDescriptor
{
    public:
        cl_EulerAngles();
        ~cl_EulerAngles();

        cl_EulerAngles* getEulerAngles(cl_EulerAngles* result);
        cl_Quaternion* getQuaternion(cl_Quaternion* result);
        cl_RodriguesParameters* getRodriguesParameters(cl_RodriguesParameters* result);
        cl_RotationMatrix* getRotationMatrix(cl_RotationMatrix* result);
        cl_TransformationMatrix* getTransformationMatrix(cl_TransformationMatrix* result);
    protected:
    private:
};

#endif // CL_EULERANGLES_H

這些功能在cl_EulerAngles.cpp文件中實現。 現在我有了問題,我得到了這樣的編譯器錯誤:

i_AttitudeDescriptor.h|17|error C2143: syntax error : missing ';' before '*'|
i_AttitudeDescriptor.h|17|error C2433: 'i_AttitudeDescriptor::cl_EulerAngles': 'virtual' not permitted on data declarations|
i_AttitudeDescriptor.h|17|error C4430: missing type specifier - int assumed|
i_AttitudeDescriptor.h|17|error C2061: syntax error : identifier 'cl_EulerAngles'|
i_AttitudeDescriptor.h|17|error C4430: missing type specifier - int assumed|
i_AttitudeDescriptor.h|17|warning C4183: 'getEulerAngles': missing return type; assumed to be a member function returning 'int'|
i_AttitudeDescriptor.h|17|error C2253: "i_AttitudeDescriptor::getEulerAngles": pure specifier only applies to virtual function – specifier ignored|
||=== Build finished: 6 errors, 1 warnings (0 minutes, 0 seconds) ===|

我希望外面有人可以幫助我解決這個小問題。 謝謝。

編譯問題是由於循環的include指令。 但是,在簡單的圓形包含之下,這里存在更大的設計問題。 基類不應該知道子類。

更好的解決方案:您應該返回一個指向Base類的指針,並使用Polymorphism

並不是一個好的解決方案:如果您確實要繼續當前的設計,則可以考慮不包括子類頭,而是在基類頭文件中聲明子類。 這將解決循環包含問題。

我建議堅持第一個解決方案。

這里的問題是循環包含; i_AttitudeDescriptor.h拉入cl_EulerAngles.h ,后者拉入i_AttitudeDescriptor.h 一旦包含了保護措施,您最終會丟失聲明,這似乎是編譯器所抱怨的。

至少有兩種解決方案:

  1. 轉發聲明i_AttitudeDescriptor.h中使用的各種類型,而不是#include包括其頭文件。 i_AttitudeDescriptor並不關心這些類的詳細信息,而只關心它們的名稱。

  2. 聲明在所有這些虛函數i_AttitudeDescriptor為返回指針i_AttitudeDescriptor ,而不是指向特定的類型。 您仍然可以使用返回指向派生類型的指針的函數在派生類中覆蓋它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM