循環参照を回避するために、各インクルードファイルをプリプロセッサ#ifdefに「ラップ」することができます。
ファイルああ:
#ifndef SOMEREALLYUNIQUEIDFileAincluded
#define SOMEREALLYUNIQUEIDFileAincluded
#include "B.h"
class B;
/// Here you can use pointers to B
class A
{
// something about B*
};
#endif // SOMEREALLYUNIQUEIDFileAincluded
ファイルBh:
#ifndef SOMEREALLYUNIQUEIDFileBincluded
#define SOMEREALLYUNIQUEIDFileBincluded
#include "A.h"
class A;
/// Here you can use pointer to A
class B
{
// something about A*
};
#endif // SOMEREALLYUNIQUEIDFileBincluded
#ifdefは「インクルードガード」と呼ばれます
最近のコンパイラでは、「ifdefs」を記述する代わりに、次のようにしか書くことができません。
#pragma once
各ファイルの先頭にあります。
編集:
次に、C.cppのすべてのヘッダーを使用します。
#include "A.h"
#include "B.h"
void test() {}
「gcc-cC.cpp」(コンパイルのみ)でテストします。
EDIT2:
ある種のサンプル。レンダリング可能なオブジェクトのあるシーン。
ファイルScene.h:
#ifndef SceneHIncluded
#define SceneHIncluded
class SceneObject;
class Scene {
public:
void Add(SceneObject* Obj);
void Render();
private:
std::vector<SceneObject*> Objects;
};
#endif // SceneHIncluded
ファイルScene.cpp:
#include "Scene.h"
#include "SceneObject.h"
void Scene::Add() { this->Objects.pusj_back(Obj); Obj->SceneRef = this; }
void Scene::Render() {
for(size_t j = 0 ; j < Objects.size() ; j++) { Objects[j]->Render(); }
}
ファイルSceneObject.h:
#ifndef SceneObjHIncluded
#define SceneObjHIncluded
class Scene;
class SceneObject {
public:
/// This is not the sample of "good" OOP, I do not suppose that
/// SceneObject needs this reference to the scene
Scene* SceneRef;
public:
// No implementation here
virtual void Render() = 0;
};
#endif // SceneObjHIncluded
SceneObjectの実装は、変換を伴うメッシュである可能性があります。
class Mesh: public SceneObject {...}
Mesh.hおよびMesh.cppファイル内。