gpt4 book ai didi

c++ - 如何管理标题的#include?

转载 作者:太空狗 更新时间:2023-10-29 21:26:39 24 4
gpt4 key购买 nike

这可能已经回答了很多次,但我似乎找不到合适的帖子来讨论这个问题。

假设我们有类 A、B 和 C,它们是彼此的容器。这意味着他们必须包含彼此的头文件。但是当我在 Visual Studio 2010 中执行此操作时,我收到错误消息“太多包含文件:深度 = 1024”。

在 Java 中,我可以拥有相互导入的类,但 C++ 似乎无法做到这一点(为什么编译器不处理这个问题,真的)。

无论如何,我该如何让它工作?

最佳答案

为避免循环引用,您可以将每个包含文件“包装”到预处理器 #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 被称为“include guards”

对于现代编译器而不是写“ifdefs”你只能写

#pragma once

在每个文件的开头。

编辑:

那么你必须使用 C.cpp 中的所有头文件:

#include "A.h"

#include "B.h"

void test() {}

用“gcc -c C.cpp”测试它(仅编译)。

编辑2:

某种样本。具有可渲染对象的场景。

文件场景.h:

#ifndef SceneHIncluded
#define SceneHIncluded

class SceneObject;

class Scene {
public:
void Add(SceneObject* Obj);
void Render();
private:
std::vector<SceneObject*> Objects;
};

#endif // SceneHIncluded

文件场景.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(); }
}

文件场景对象.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 文件中。

关于c++ - 如何管理标题的#include?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10865509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com