转发声明在未命名的命名空间中定义的类

时间:2015-03-09 09:39:15

标签: c++ class namespaces

我试图扩展预先存在的类,并希望为其添加新功能。 我创建了一个新类来执行新的扩展功能,但由于此功能对于预先存在的类来说太具体了,我将类实现移动到预先存在的类的.cpp文件中的未命名命名空间。(它在未命名的命名空间中)因为它实际上并不属于预先存在的类所保留的命名空间。 每个现有的类仍然应该存储这个新类的指针。 我做了这样的实现:

我在命名空间中有预先存在的类说(xyz): 我的.h看起来像这样:

// Forward declare the class
namespace
{
// This is the class in which I have kept my extended functionality
class MyClass;
}

namespace xyz
{
  class Subject
  {
  public:
    Subject();
  private:
//keeping the pointer in Pr-Existing class
    std::unique_ptr< MyClass > mMyClass
  };
}

在.cpp中我在一个未命名的命名空间中定义了MyClass。

所以我的.cpp看起来像这样:

namespace
{
  class MyClass
  {
    .
    .
    .
  };
}

xyz::Subject::Subject()
{
  mMyClass.reset( new MyClass() );
}

现在我无法编译程序,编译器认为在两个地方声明的MyClass是不同的。 我收到这样的错误:

错误:对'MyClass'的引用含糊不清         mMyClass.reset(new MyClass));                                     ^ .h:注意:通过名称查找找到的候选人是'MyClass' class MyClass;       ^ .cpp:注意:通过名称查找找到的候选人是':: MyClass'         class MyClass:public MyClass

我可以通过将MyClass保留在命名空间xyz中来解决它。 但是如果没有它,有没有办法呢?

1 个答案:

答案 0 :(得分:0)

感谢您的回复。

似乎我试图实现它并不是一个好的设计实践。 我在.h中声明未命名命名空间中的类是个坏主意。 它将可用于我将包含此标头的所有文件。 简而言之,它与我想要的相反(保持这个类私有) 现在我将使用pImpl成语而不是这个。