2012-12-28 48 views
5

首先,我的英语很抱歉。将两个或多个C++命名空间合并为一个

好吧,我正在执行一个程序,执行一个特定的过程。这个过程需要定义一些类和函数。他们都必须分块组织才能访问它们。

我的第一个想法是用命名空间(C++)的工作,得到这样的事情:

namespace LoadSystem 
{ 
    namespace ParseBlock1 
    { 
     class ClassA {...} 
     class ClassB {...} 
     class ClassC {...} 
    } 
    namespace ParseBlock2 
    { 
     class ClassA {...} 
     class ClassB {...} 
     class ClassC {...} 
    } 
} 

所以,我正在读以获得最佳的想法,如果这是好还是不好。我已经读过,我不能使用大量的嵌套命名空间,所以,为了我的目的,最小级别是两个,如上所示。

我的目标是能够在LoadSystem命名空间中添加越来越多的ParseBlocks。它将被存储在一个单独的.h文件中,因此,将只有这些类的接口。由于每个块可以有很多类,我想将每个块的定义分割为其他.h文件,以便尽可能保持主文件较小。

所以,我定义文件block1.hblock2.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::Class1LoadSystem::ParseBlock2::Class1访问来自同一名称空间的两个块。

我已经用简单的整数值测试过了,它起作用。命名空间结合起来,我可以访问值没有任何警告(我使用gcc -Wall -Werror -Wextra -pedantic)。

那么,这是命名空间的组合是否正确。也许它有效,但我可能不应该使用它,我不知道。

另外,我想知道,如果这个过程中,输入“主”头文件(其中进口其他头文件)也正确(我使用的需要#ifndef#define#endif宏从防范多个进口),我使用这样的东西:

# ifndef LOAD_SYSTEM_H_ 
# define LOAD_SYSTEM_H_ 

# include "block1/block1.h" 
# include "block2/block2.h" 

# endif 

所以,请帮助我知道这是否正确或不。

谢谢大家。

+2

据我所知,这是一个完全正确的使用名称空间的方式。你可以有许多并行使用它们,没有问题。 (我不知道的是你是否真的需要所有这些命名空间;如果不理解所有的类是如何使用的以及它们是如何使用的,很难说清楚。) – jogojapan

+1

你的英语非常好。我做了一些小的修改,以平滑它的流畅性和格式。 – wallyk

+0

jogojapan:谢谢,我终于(阅读答案)明白,这个“组合”的过程不是一个错误。谢谢。 wallyk:设计指定了一些逻辑体系结构,所以我认为我必须尝试在代码上表示该体系结构:P,但在这里阅读答案,并更多地考虑名称空间的情况和性质,我想我将只管理一个级别:P(程序的名称,像MySystem :: Class1,MySystem :: Class2等等)。 –

回答

2

您可以随时扩展现有名称空间,以便该部分正常。

而那部分是唯一有一个简单的技术答案。

关于“主标题文件”,这是更主观的,个人喜好的问题。我更喜欢包含的头文件可以在没有任何先决条件的情况下自行包含(比如在其他文件之前)。如果是这样,那么对我来说一切正常,但如果没有,那么你的代码的用户在实践中必须包含大的主头文件以获得任何小头,并且这会影响构建时间的消极(如果他们不't,但它们本身包含先决条件,然后它们有脆弱的代码,当你更新标题时可能会停止工作)。

+0

非常感谢您的回答。正如我上面所说,我现在将尝试仅使用一个级别的名称空间(程序名称)。而且,我知道将大量头文件导入代码文件会影响编译时间,也可能影响二进制大小。所以,我会尝试使用直接导入调用(导入类文件而不是主头文件)。 感谢您的帮助:D –