C++ 引用超类(C+;+;)中的子类
我在设计的实现上遇到了问题。有一个超类定义方法,它将该超类的子类作为返回值。正如你在这里看到的:C++ 引用超类(C+;+;)中的子类,c++,inheritance,compiler-errors,subclass,superclass,C++,Inheritance,Compiler Errors,Subclass,Superclass,我在设计的实现上遇到了问题。有一个超类定义方法,它将该超类的子类作为返回值。正如你在这里看到的: #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_Tra
#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指令。然而,在简单的圆形夹杂下,这里有一个更大的设计问题。基类不应该知道子类 更好的解决方案:您应该返回指向基类的指针并使用
<强>不好的解决方案:如果你真的想继续你当前的设计,你可能会考虑不包括子类头,而是在基类头文件中向前声明你的子类。这将解决圆形夹杂问题
我建议坚持第一种解决方案。编译问题是因为循环include指令。然而,在简单的圆形夹杂下,这里有一个更大的设计问题。基类不应该知道子类 更好的解决方案:您应该返回指向基类的指针并使用
<强>不好的解决方案:如果你真的想继续你当前的设计,你可能会考虑不包括子类头,而是在基类头文件中向前声明你的子类。这将解决圆形夹杂问题
我建议坚持第一种解决方案。这里的问题是循环包含
i_AttitudeDescriptor.h
拉入cl_EulerAngles.h
,它拉入i_attitudescriptor.h
。一旦include守卫启动,您就会丢失声明,这似乎是编译器所抱怨的
至少有两种解决方案:
i_AttitudeDescriptor.h
而不是#中使用的各种类型,包括
及其头文件i_AttitudeDescriptor
不关心这些类的细节,只关心它们的名称i_AttitudeDescriptor
中的所有虚拟函数声明为返回指向i_AttitudeDescriptor
的指针,而不是指向特定类型的指针。您仍然可以在派生类中使用返回派生类型指针的函数重写它们这里的问题包括:
i_AttitudeDescriptor.h
拉入cl_EulerAngles.h
,它拉入i_attitudescriptor.h
。一旦include守卫启动,您就会丢失声明,这似乎是编译器所抱怨的
至少有两种解决方案:
i_AttitudeDescriptor.h
而不是#中使用的各种类型,包括
及其头文件i_AttitudeDescriptor
不关心这些类的细节,只关心它们的名称i_AttitudeDescriptor
中的所有虚拟函数声明为返回指向i_AttitudeDescriptor
的指针,而不是指向特定类型的指针。您仍然可以在派生类中使用返回派生类型指针的函数重写它们基类实际上不应该知道任何派生类。考虑返回基类指针和使用多态性。您对设计本身有一个问题。基类不应返回派生类的实例。您可以使用前向声明来解决这个问题,但它无法修复设计。基类实际上不应该知道任何派生类。考虑返回基类指针和使用多态性。您对设计本身有一个问题。基类不应返回派生类的实例。您可以使用前向声明来解决此问题,但它无法修复设计。