如何与私人嵌套成为朋友 class

How to befriend private nested class

我以为我可以做到:

class TestA
{
private:
  class Nested
  {

  };
};

class TestB
{
public:
  friend class TestA;
  friend class TestA::Nested;
};

但是我得到一个错误:

Error C2248 'TestA::Nested': cannot access private class declared in class

有没有办法与私有嵌套 class 交朋友?我该怎么做?

我在 MSVC 2017 (C++17) 中尝试编译 MSVC 6 项目时遇到此错误。我想那时候它起作用了。

您正在尝试在 TestB 中使用 TestAprivate 嵌套 class,那么您应该将 TestB 声明为 friendTestA。例如

class TestA
{
private:
  class Nested
  {

  };
  friend class TestB; // allow TestB to access the private members of TestA
};

与您访问任何其他私人物品的方式相同。你需要反过来的友谊:

class TestA
{
  friend class TestB; // <== this
private:
  class Nested
  {

  };
};

class TestB
{
public:
  friend class TestA;
  friend class TestA::Nested; // <== now we're a friend of TestA, so we can access it
};

这样做就可以了:

class TestA {
   friend class TestB;
   private:

   class Nested {};
};

class TestB {
   public:
      friend class TestA::Nested;
};

说明:TestA 自己有责任将其内部结构的访问权限授予其他人。想象一下,任何 class 都可以侵入性地使用友谊来访问其他 类 的内部结构(来自图书馆等),这将为任意破坏封装打开大门。

只需注释掉 friend class TestA::Nested; 行,如下所示:

class TestA
{
private:
  class Nested
  {

  };
};

class TestB
{
public:
  friend class TestA;
  // friend class TestA::Nested;
};

由于 TestA::Nested 具有与 TestA 相似的作用域,TestA::Nested 的方法可以访问 TestB 的 private/protected 个成员。