嵌套朋友类所需的前向声明

时间:2017-06-22 20:30:43

标签: c++ class nested declaration forward

假设我有两个类定义如下:

class obj1
{
  private:
    int mem;
    void method1();

  friend class obj2;
};

class obj2
{
  public:
    void method2();
};

void obj2::method2()
{
  obj1 test;
  test.mem = 59999;
  std::cout << test.mem;
  return;
}

这很有效。在main中,如果我声明一个obj2类型的对象然后调用它的method2成员函数,它可以成功地从obj1的实例访问私有变量。现在,假设我将这些类嵌套:

class parent
{
  public:
  class obj1
  {
    private:
      int mem;
      void method1();

    friend class obj2;
  };

  class obj2
  {
    public:
      void method2();
  };
  void my_function();
};

void parent::obj2::method2()
{
  obj1 test;
  test.mem = 59999;
  std::cout << test.mem;
  return;
}

void parent::my_function()
{
  obj2 test2;
  obj2.method2();
  return;
}

这不会编译。它说“mem”是私有的,即使obj2被宣布为朋友类。我可以解决这个问题的唯一方法是将obj2类的前向声明放在obj1类的定义之前。然而,如果类没有嵌套,我不必这样做。 为什么会这样?

1 个答案:

答案 0 :(得分:5)

friend声明的上下文中查找声明为friend的类。如果找到一个,则该类为friend。如果未找到,则在最近的命名空间级别声明该类,并将此类设为friendfriend声明不会引入嵌套类名。不过,它会使找到的嵌套类成为friend