Как подружиться с частным вложенным классом - PullRequest
14 голосов
/ 09 июля 2019

Я думал, что смогу сделать это:

class TestA
{
private:
  class Nested
  {

  };
};

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

Но я получаю ошибку:

Ошибка C2248 'TestA :: Nested': не может получить доступ к закрытому классу, объявленному в классе

Есть ли способ подружиться с частным вложенным классом?Как мне это сделать?

Я столкнулся с этой ошибкой при попытке скомпилировать проект MSVC 6 в MSVC 2017 (C ++ 17).Я думаю, это сработало тогда.

Ответы [ 4 ]

15 голосов
/ 09 июля 2019

Точно так же, как вы получаете доступ к любой другой личной вещи. Вам нужна дружба по-другому:

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
};
8 голосов
/ 09 июля 2019

Это будет сделано:

class TestA {
   friend class TestB;
   private:

   class Nested {};
};

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

Пояснение: * * * * * * * * * TestA сам несет ответственность за предоставление доступа к своим внутренним элементам другим.Представьте, что любой class может навязчиво использовать дружбу, чтобы получить доступ к внутренним элементам других классов (из библиотек и т. Д.), Это откроет дверь для произвольного нарушения инкапсуляции.

4 голосов
/ 09 июля 2019

Вы пытаетесь использовать private вложенный класс TestA в TestB, тогда вы должны объявить TestB как friend в TestA.например,

class TestA
{
private:
  class Nested
  {

  };
  friend class TestB; // allow TestB to access the private members of TestA
};
0 голосов
/ 09 июля 2019

Просто закомментируйте строку 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.

...