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

but*_*oys 4 c++ namespaces

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

class IFoo {...}
class Foo : public IFoo {...}
Run Code Online (Sandbox Code Playgroud)

当我希望从 Foo 派生的子类通过名称空间进行区分时,我遇到了命名难题。例如,

Bar::Foo
Baz::Foo
Run Code Online (Sandbox Code Playgroud)

因为当我编码时

namespace Bar { class Foo : public Foo {} }
Run Code Online (Sandbox Code Playgroud)

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

class MyFoo : public IFoo
namespace Bar { class Foo : public MyFoo {} }
Run Code Online (Sandbox Code Playgroud)

或者

namespace base { class Foo : public IFoo {} }
namespace Bar { class Foo : public base::Foo {} }
Run Code Online (Sandbox Code Playgroud)

但不希望命名混乱。

我知道拥有 Foo、Bar::Foo 和 Baz::Foo 类是不好的,因为明显的混乱。(例如,添加“using Bas;”会引起歧义。)是否有一个命名约定或语法可以清楚地关联我想要做的事情?

cdh*_*wie 5

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

class IFoo {};
class Foo : public IFoo {};

namespace Bar { class Foo : public ::Foo {}; }
Run Code Online (Sandbox Code Playgroud)