разница между вложенной структурой / классами и объявлением экземпляров класса внутри класса

#c

#c

Вопрос:

Предположим, у нас есть две структуры, bigguy и foryou.

Мы могли бы объявить их следующим образом:

 struct bigguy
{
    struct foryou
    {
        int survivors;
    }cia, pavel;
};
  

или мы могли бы объявить их следующим образом:

 struct foryou
{
    int survivors;
};

struct bigguy
{
    foryou cia;
    foryou pavel;
};
  

Каковы преимущества и недостатки каждого типа объявления? Зависит ли это от цели программы? Считается ли один метод лучшей практикой, чем другой? (Предположим, что в гипотетической программе есть реальная причина не просто объявлять все как единую структуру.)

Комментарии:

1. «Зависит ли это от цели программы?» Конечно. Это просто способ организовать область видимости.

Ответ №1:

Вот некоторые преимущества вложенной структуры по сравнению с несколькими структурами:

  • У вас есть возможность скрыть вложенную структуру в private разделе. Следовательно, остальной части вашего кода не нужно заботиться об этом.
  • Рефакторинг мог бы быть проще.
  • Каждый производный класс bigguy , естественно, будет видеть foryou , даже если они находятся в разных пространствах имен или областях. Это также интересно для вложенных enum , поскольку вы можете ссылаться на перечисленные константы, не добавляя к ним префикс в контексте пространства имен.

Вот некоторые преимущества нескольких структур перед вложенными структурами.

  • Если вы хотите использовать foryou структуру вне bigguy класса, вам нужно добавить к ней префикс, bigguy:: который иногда является сложным синтаксисом. Обратите внимание, что auto интересно избегать таких объявлений.
  • у вас будут более понятные сообщения компилятора, если bigguy это шаблонный класс, и вы избежите некоторых применений typename . На самом деле if bigguy является шаблонным классом и if foryou не нуждается в параметрах шаблона, предпочтительнее использовать несколько структур. Лучше, если вы можете получить свой bigguy шаблонный класс из не шаблонного класса, который имеет foryou inside .