【问题标题】:Foreward declaring a class defined in an unnamed namespace前向声明在未命名命名空间中定义的类
【发布时间】:2015-05-10 10:06:50
【问题描述】:

我试图扩展一个预先存在的类,并想为其添加新功能。 我创建了一个新类来执行新的扩展功能,但是由于这个功能对预先存在的类来说太具体了,我将类实现移动到预先存在的类的 .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() );
}

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

错误:对“MyClass”的引用不明确 mMyClass.reset(new MyClass)); ^ .h:注意:通过名称查找找到的候选人是“MyClass” 我的班级; ^ .cpp:注意:通过名称查找找到的候选人是 '::MyClass' class MyClass : public MyClass

我可以通过将 MyClass 保留在命名空间 xyz 中来解决它。 但是有没有办法做到这一点..?

【问题讨论】:

  • 为什么不能命名命名空间,例如namespace fwd?还是将MyClass 留在snamespace 之外?
  • 最好将定义放入命名空间以避免污染全局命名空间。
  • 每个未命名的命名空间都是唯一的。

标签: c++ class namespaces


【解决方案1】:

感谢您的回复。

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

【讨论】:

    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 2020-12-03
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 2015-03-29
    • 2011-03-02
    相关资源
    最近更新 更多