背景:既存の Java クラス モデルに基づいて C++ コードを生成するフレームワークに取り組んでいます。このため、以下で説明する循環依存関係を変更することはできません。
与えられた:
- 親子クラスの関係
- 親には子のリストが含まれています
- ユーザーは実行時にリスト要素のタイプを検索できる必要があります
これを次のテストケースでモデル化しました。
メイン.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 '::'
atreturn ElementType::getType();
循環依存は、次の理由で発生します。
- Child.h はクラス Parent について知る必要があります
- Parent.h はクラス Array について知る必要があります
- Array.h はクラス Child について知る必要があります
何か案は?