我有3个类(可能是300个),每个类都有自己的标题和实现。 我想写一个'优雅'的方式来组织我加载三个中每个类所需的任何类的方式。也许这个例子有帮助...
我有:class1 class2 class3
每个标题都有:
#ifndef CLASS#_H
#define CLASS#_H
#define FORWARD_STYLE
#include "general.h"
#endif
每个实施都有:
#define DIRECT_STYLE
#include "general.h"
行 我要编写一个'general.h'文件,其中包含:
#ifndef DIRECT_STYLE
#ifndef CLASS1_H
#include "class1.h"
#endif
#ifndef CLASS2_H
#include "class2.h"
#endif
#ifndef CLASS3_H
#include "class3.h"
#endif
#endif
#ifndef FORWARD_STYLE
class Class1;
class Class2;
class Class3;
#endif
// a lot of other elements needed
#include <string.h>
#include <stdio.h"
....
#include <vector.h"
( all the class I need now and in the future )
这是一个很好的结构?或者我正在做一些白痴的事情? 我的目标是有一个独特的'general.h'文件来写我需要的所有元素...... 这样可以正常工作吗? 感谢
答案 0 :(得分:4)
现在这可能是个好主意,但不会扩展,应该避免。您的general.h文件将包含大量文件,因此包含它的所有文件将(a)由于内存限制而需要花费很长时间来编译或根本不编译;(b)每次都必须重新编译任何更改。
直接在每个文件中包含您需要的标头,并定义一些前向声明文件,您应该没问题。
答案 1 :(得分:4)
要遵循的基本规则是:
总的来说,避免在源文件中通过公共标头包含不必要的代码是一个好主意,因为它只会导致代码膨胀,所以尽量将其保持在最低限度。包含标题只是实际复制将整个标题粘贴到源文件中并包含不必要的文件有几个缺点,即:
答案 2 :(得分:0)
标题中的#define
可能没问题,但它可以通过大量来源传播并可能导致问题。更严重的是,任何时候general.h
或其任何包含都会改变整个项目的重建。对于小型项目,这不是问题,对于较大的项目,它将导致不可接受的构建时间。
相反,我使用了一些指导原则:
#include "blah_fwd.h"
的内容。using
,因为它会污染全局命名空间。如果这看起来像很多工作,不幸的是因为它是。这是一个从C继承的系统,需要一定程度的程序员维护。如果您希望能够在较高级别决定项目使用的是什么,并让编译器/运行时计算出来,那么C ++可能不是您项目的正确语言。