为避免循环引用,您可以将每个包含文件“包装”到预处理器#ifdef 中。
文件 A.h:
#ifndef SOMEREALLYUNIQUEIDFileAincluded
#define SOMEREALLYUNIQUEIDFileAincluded
#include "B.h"
class B;
/// Here you can use pointers to B
class A
{
// something about B*
};
#endif // SOMEREALLYUNIQUEIDFileAincluded
文件 B.h:
#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 -c C.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 文件中。