1

デザインの実装に問題があります。戻り値としてこのスーパークラスのサブクラスを持つメソッドを定義するスーパークラスがあります。ここでわかるように:

#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

サブクラスの 1 つは、たとえば次のように指定されます。

#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) ===|

誰かがこの小さな問題を解決するのを手伝ってくれることを願っています。ありがとうございました。

4

2 に答える 2

5

コンパイルの問題は、循環インクルード ディレクティブが原因です。ただし、単純な円形のインクルージョンの下には、より大きな設計上の問題があります。基本クラスはサブクラスを認識していません。

より良い解決策: Base クラスへのポインターを返し、Polymorphismを使用する必要があります。

あまり良い解決策ではありません:現在の設計を本当に続けたい場合は、サブクラスのヘッダーを含めずに、基本クラスのヘッダー ファイルでサブクラスを前方宣言することを検討してください。これにより、循環包含が解決されます。

最初の解決策に固執することをお勧めします。

于 2013-03-19T16:15:18.560 に答える
2

ここでの問題は循環インクルードです。i_AttitudeDescriptor.h引き込む、cl_EulerAngles.h引き込むi_AttitudeDescriptor.h。インクルードガードが作動すると、宣言が欠落することになります。これは、コンパイラが不満を言っているようです。

少なくとも 2 つの解決策があります。

  1. ヘッダー ファイルを ing するi_AttitudeDescriptor.h代わりに使用されるさまざまな型を前方宣言します。これらのクラスの詳細は気にせず、名前だけを気にします。#includei_AttitudeDescriptor

  2. これらすべての仮想関数を、特定の型へのポインターではなく、へのi_AttitudeDescriptorポインターを返すものとして宣言します。i_AttitudeDescriptor派生型へのポインターを返す関数を使用して、派生クラスでそれらをオーバーライドすることもできます。

于 2013-03-19T16:16:24.817 に答える