首先,对不起我的英语。
好的,我正在开展一个执行特定流程的程序。此过程需要定义一些类和函数。所有这些都必须按块进行组织才能访问它们。
我的第一个想法是使用命名空间(C ++),得到这样的东西:
namespace LoadSystem
{
namespace ParseBlock1
{
class ClassA {...}
class ClassB {...}
class ClassC {...}
}
namespace ParseBlock2
{
class ClassA {...}
class ClassB {...}
class ClassC {...}
}
}
所以,如果这是好的话,我正在阅读以获得最好的想法。我已经读过,我不能使用大量的嵌套命名空间,因此,就我的目的而言,最小级别为2,如上所示。
我的目标是能够在ParseBlocks
命名空间中添加越来越多的LoadSystem
。它将存储在单个.h
文件中,因此,只有类的接口。由于每个块可能有很多类,因此我想将每个块的定义拆分为其他.h
文件,以使主.h
文件尽可能小。
所以,最后我想到了一个定义文件block1.h
和block2.h
的想法,每个文件都有这样的结构:
namespace LoadSystem
{
namespace ParseBlock1
{
class ClassA {...}
class ClassB {...}
class ClassC {...}
}
}
和
namespace LoadSystem
{
namespace ParseBlock2
{
class ClassA {...}
class ClassB {...}
class ClassC {...}
}
}
并将其导入load_system.h
文件。因此,每次我需要添加另一个块时,我都会编写所需的文件,最后,我只需将新的blockX.h
导入主load_system.h
。
然后,我必须能够使用LoadSystem::ParseBlock1::Class1
或LoadSystem::ParseBlock2::Class1
来访问同一命名空间中的两个块。
我用简单的整数值对它进行了测试,但它确实有效。命名空间组合在一起,我可以在没有任何警告的情况下访问这些值(我使用了gcc -Wall -Werror -Wextra -pedantic
)。
那么,命名空间的这种组合是否正确。也许它有效,但我可能不应该使用它,我不知道。
另外,我想知道导入“主”头文件(导入其他头文件)的过程是否也正确(我正在使用所需的#ifndef
,{{1}和#define
宏来防止多次导入),我使用的是这样的东西:
#endif
所以,请帮助我知道这是否正确。
谢谢大家。
答案 0 :(得分:2)
您始终可以扩展现有的命名空间,以便该部分正常。
那部分是唯一有简单技术答案的部分。
关于“主标题文件”,它更主观,是个人偏好的问题。我更喜欢包含的标题可以自己包含在内而没有任何先决条件(比如包括其他内容)。如果是这样,那么对我来说一切都没问题,但如果没有,那么你的代码用户实际上必须包含大的主头文件以获得任何小的标题,这会对构建时间产生负面影响(如果他们不这样做的话)但是,但是它们本身包含先决条件,那么它们会有一些脆弱的代码,在更新标题时可能会停止工作。)