在Java中,我发现使用命名空间非常简单。对于我在源文件中使用的每个限定标识符Ident
,我在文件的顶部放置了import ns1.ns2.ns2.ns3.ns4.Ident;
。然后我可以在源代码中的任何地方使用(简短的)不合格的名称。 import
语句不会导致任何问题,因为它仅适用于写入它的文件。
但是,我不太确定如何以最好的方式摆脱C ++中的命名空间限定符。
最常见的解决方案可能是using
和using namespace
语句。但是,这似乎是一个相当糟糕的解决方案,至少在头文件的情况下,因为using语句不限于写下它们的单个文件。因此,例如using
被排除在外。瘦文库只包含头文件的头文件,一般是在头文件的情况下实现的。
到目前为止,我使用的另一个选项是为类中的每个限定名添加一个类,在类的私有部分中对应typedef
。因此,在将此方法与Java进行比较时,我基本上采用整个导入语句列表,将import
替换为typedef
并将其放在类声明中。
但是,我并不喜欢这种方法,因为我的类的用户 - 严格来说 - 不知道返回值和参数值的类型,因为方法声明中的类型是相应类的私有类型
好的,现在我们可以将所有这些typedef
内容公之于众。但这可能不是一个好主意,因为我们会多次重新定义每种类型。只需考虑一个结构ns1::ns2::ns3::MyStructure
和两个类MyClassA
和MyClassB
。这两个类都有一个方法,实际上应该将ns1::ns2::ns3::MyStructure
的实例作为参数。但是因为每个类都重新定义了用于去除长限定名称的类型,所以这两种方法现在采用“不同”类型的参数,比如MyClassA::MyStructure
和MyClassB::MyStructure
。当我们有一个第三类MyClassC
与MyStructure
的实例一起使用并且需要用它调用这两个方法时,它变得更加引人注目。此类是否应使用MyClassA::MyStructure
,MyClassB::MyStructure
或MyClassC::MyStructure
类型声明此实例?
嗯,我只想知道:摆脱命名空间限定符的最佳做法是什么?