наследование — ссылка на подклассы в суперклассе (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) ===|

Я надеюсь, что кто-то может помочь мне решить эту маленькую проблему.
Спасибо.

1

Решение

Проблема компиляции из-за циклических директив include. Тем не менее, под простым круговым включением здесь есть большая проблема дизайна. Базовый класс не должен знать подклассы.

Лучшее решение: Вы должны вернуть указатель на базовый класс и использовать Полиморфизм.

Не то хорошее решение: Если вы действительно хотите продолжить свой текущий дизайн, вы можете рассмотреть возможность не включать заголовки подкласса, а перевести объявление ваших подклассов в файл заголовка базового класса. Это решит круговое включение.

Я бы порекомендовал придерживаться первого решения.

5

Другие решения

Проблема здесь круговая включает в себя; i_AttitudeDescriptor.h тянет в cl_EulerAngles.h, который тянет в i_AttitudeDescriptor.h, Как только включаются охранники включения, вы в конечном итоге пропускаете объявления, на которые, похоже, жалуется компилятор.

Есть как минимум два решения:

  1. Форвард объявить различные типы, которые используются в i_AttitudeDescriptor.h вместо #includeих заголовочные файлы. i_AttitudeDescriptor не заботятся о деталях этих классов, только их имена.

  2. Объявите все эти виртуальные функции в i_AttitudeDescriptor как возвращающие указатели на i_AttitudeDescriptor а не указатели на конкретные типы. Вы все еще можете переопределить их в производных классах с помощью функций, которые возвращают указатели на производные типы.

2

По вопросам рекламы [email protected]