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

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

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

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

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

@TarickWelling Нет. TestB не происходит от TestA.

L. F. 09.07.2019 12:46
TestA необходимо объявить TestB как friend. TestB не может использовать TestA::Nested, если TestA не позволяет это.
Peter 09.07.2019 12:46

TestA тоже должен быть другом или только чтоNested?

Davis Herring 12.07.2019 00:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
3
882
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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
};

@Quentin Я говорю, что Барри нашел structуральный образ жизни while, поддерживая class. Вот почему я стремлюсь быть friend.

Hatted Rooster 09.07.2019 13:08

@SombreroChicken И вы не можете произнести поддержание без int main().

nada 09.07.2019 13:15

Это сделает это:

class TestA {
   friend class TestB;
   private:

   class Nested {};
};

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

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

@Bathsheba Спасибо, что придали моему ответу больше уверенности в себе;)

lubgr 09.07.2019 12:53

Как дружба предоставление с недоступным классом нарушит инкапсуляцию? Более вероятной проблемой может быть хрупкость от переименования/удаления частного класса.

Davis Herring 12.07.2019 00:43

@DavisHerring Переименование / удаление - действительно еще одна проблема, хороший момент. Я имел в виду, что если какой-то клиентский код может установить отношения friend с другим классом, возможно, за пределами его собственной кодовой базы, то это нарушает инкапсуляцию.

lubgr 12.07.2019 09:28

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

Интересно, протестировали ли даунвотеры это на самом деле. Этот ответ правильный на 100% godbolt.org/z/VypZo2

sebrockm 10.07.2019 02:20

@sebrockm - Вы пропустили тот факт, что он не позволяет получить доступ Nested? Это не отвечает на вопрос правильно. Или вы голосуете за каждый фрагмент кода независимо от его актуальности?

StoryTeller - Unslander Monica 10.07.2019 06:05

@StoryTeller, пожалуйста, помогите мне определить часть вопроса, которая хочет получить доступ Nested. Если мой английский не слишком испорчен, ОП хочет предоставить TestA::Nested доступ к приватным полям TestB (он же сделать Nested другом TestB). И этот ответ говорит: «Если вы подружитесь с TestA, Nested тоже автоматически станет другом». Так что же не так с этим ответом?

sebrockm 10.07.2019 09:44

@sebrockm - Nested тоже не друг, он использует дружбу TestA и правила области видимости. Что может быть или не быть приемлемым. Однако это не отвечает на вопрос, как подружиться с Nested самой собой. ОП, кажется, хочет, чтобы несмотря подружился TestA. Следовательно, люди имеют право считать этот ответ бесполезным для вопроса. 100% правильно или нет.

StoryTeller - Unslander Monica 10.07.2019 09:51

@StoryTeller, может быть предметом обсуждения вопрос о том, трепетно ​​ли относится к некоторым именам (называется ли это дружбой или нет), хотя он делает то же самое, оправдывает отрицательный голос или нет. Однако я скорее верю, что даунвотеры просто не поверили, что это работает, не проверив это, или неверно истолковал, кто должен иметь доступ к кому (как это только что случилось с вами).

sebrockm 10.07.2019 10:41

@sebrockm - Не лезь мне в рот. Я назвал это неуместным, а не неправильным. И не претендуйте на то, чтобы знать, как другие голосуют или на основании чего. Ваш голос в порядке, ваш комментарий - нет. Добрый день.

StoryTeller - Unslander Monica 10.07.2019 10:47

Другие вопросы по теме