是否可以在C ++中的匿名命名空间中使用某个类?

时间:2013-11-09 05:59:25

标签: c++ namespaces friend

我正在将代码从Java移植到c ++,我想复制一些匿名功能。

在文件A.h中我有:

class A
{
private:
  int a;

  class AnonClass;
  friend class AnonClass;
};

在文件A.cpp中我有:

namespace
{
  class AnonClass
  {
  public:
    AnonClass(A* parent)
    {
      parent->a = 0; // This doesn't work, a is not accessible
    }
  }
}

是否可以在C ++中的匿名命名空间中使用某个类?

在Java中,您可以声明匿名类,因此它非常相似。此外,它不会将AnonClass暴露给A.h

的客户

2 个答案:

答案 0 :(得分:23)

鲜为人知的替代方法是使类Anon成为A的成员类。在A类中,您只需要一行class Anon; - 没有真正的代码,没有朋友声明。请注意,它在A类中,几乎与Java中一样。在.cpp文件中,您可以编写有关Anon的所有详细信息,但是您不能将其放在匿名命名空间中,而是放在A::

  class A::Anon { ..... };

您可以像往常一样拆分A :: Anon的声明和实现,只需记住将A :: A添加到Anon。

Anon类是A的成员,因此可以访问A的所有其他成员。但A的客户端仍然不知道它,并且不会混淆全局命名空间。

答案 1 :(得分:4)

据我所知,你不能。原因:

  1. “匿名”命名空间只能在您创建的文件中访问。
  2. 您必须在一个名称空间中定义整个AnonClass类及其功能,即在程序的一个位置。
  3. 必须在AnonClass构造函数之前定义类A.
  4. AnonClass必须至少在A级之前声明。
  5. 所以你看,你不能在两个部分打破AnonClass的定义。并且你不能在A类之前和之后定义它。

    唯一的选择 - 将A类放入同一个匿名命名空间。此代码有效:

    namespace 
    {
      class A
      {
       public:
        A():a(0){};
       private:
        int a;
    
        friend class AnonClass;
      };
    
      class AnonClass
      {
      public:
        AnonClass(A* parent);
      };
    
      AnonClass::AnonClass(A* parent)
      {
          parent->a = 0;
      };
    }
    
    int main() {
      A a;
    
      return 0;
    }
    

    我希望这会有所帮助。