具有具体和命名空间子类的接口类的C ++类命名约定

时间:2017-05-09 17:14:48

标签: c++ namespaces

约定是字母“I”继续进行纯虚拟接口类。通常,我发现我还需要一个具有子类共享功能的部分具体类。所以,

class IFoo {...}
class Foo : public IFoo {...}

当我希望从Foo派生的子类由名称空间区分时,我会遇到命名难题。如,

Bar::Foo
Baz::Foo

因为当我编码

namespace Bar { class Foo : public Foo {} }

毫不奇怪,VS给出的错误是“一个类不能成为它自己的基类”。 (当没有“中间类,因为命名是Bar :: IFoo和Baz :: IFoo时,不是问题。)我可以用

来解决这个问题。
class MyFoo : public IFoo
namespace Bar { class Foo : public MyFoo {} }

namespace base { class Foo : public IFoo {} }
namespace Bar { class Foo : public base::Foo {} }

但不愿意混淆命名。

我得到了Foo,Bar :: Foo和Baz :: Foo等课程因为明显的混乱而很糟糕。 (例如,添加“使用Bas;”会引入歧义。)是否存在明确与我正在尝试做的命名约定或语法?

1 个答案:

答案 0 :(得分:2)

承认你的评论认为拥有所有这些同名的类型是个坏主意,你可以通过在::前面加上前缀来专门引用全局命名空间中的类型。在这种情况下,这意味着您可以在全局命名空间中引用类型Foo,而在命名范围的上下文中定义自己的Foo,通过将全局命名为{{1} }}。所以works

::Foo