Background: Я работаю над framework, который генерирует код на C++ на основе существующей модели класса Java. По этой причине я не могу изменить упомянутую ниже круговую зависимость.Шаблоны, круговые зависимости, методы, о, мой!
Дано: отношения класса
- Родитель-Ребенок
- Родитель содержит список детей
- Пользователи должны иметь возможность посмотреть тип элемента списка во время выполнения
Я смоделировал это в следующей тестовой таблице:
Main.cpp
#include "Parent.h"
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char* argv[])
{
Parent parent;
cout << Parent::getType() << endl;
cout << parent.getChildren().getType() << endl;
return 0;
}
Parent.h
#ifndef PARENT_H
#define PARENT_H
#include <string>
#include "Array.h"
class Child;
class Parent
{
public:
Array<Child> getChildren()
{
return Array<Child>();
}
static std::string getType()
{
return "parent";
}
};
#endif
Child.h
#ifndef CHILD_H
#define CHILD_H
#include "Parent.h"
class Child: public Parent
{
};
#endif
Array.h
template <typename ElementType>
class Array
{
public:
static std::string getType()
{
return ElementType::getType();
}
};
Когда я компилирую приведенный выше код я получаю:
error C2027: use of undefined type 'Child'
наreturn ElementType::getType();
Если я пытаюсь
#include "Child.h"
вместо прямого заявления я получаю:error C2504: 'Parent' : base class undefined
вclass Child: public Parent
Если я пытаюсь
Array<Child*>
вместоArray<Child>
я получаю:error C2825: 'ElementType': must be a class or namespace when followed by '::'
вreturn ElementType::getType();
Круговая зависимость возникает из-за:
- Child.h должен знать о классе Parent
- Parent.h нужно знать о классе массива
- Array.h должен знать о классе ребенка
Есть идеи?
Родитель, который знает о его производных классов кажется мне недостатком дизайна. – Shirik
Справедливо, но, как я уже объяснил, я ничего не могу сделать, чтобы изменить это. Я создаю код, основанный на проектах, которые существуют в дикой природе. – Gili
Где находится код 'ElementType child;'? – rlbond