вложенные классы в с ++ - PullRequest
       0

вложенные классы в с ++

2 голосов
/ 04 октября 2010

мой вопрос: как часто Вы действительно используете вложенные классы в своей практике и в каких случаях? Какова реальная сила вложенных классов, что нельзя сделать без них? Постскриптум пожалуйста, не объясните, что это, я знаю это (from technical point of view)

Ответы [ 4 ]

6 голосов
/ 04 октября 2010

Я обычно использую вложенные классы для встраивания объектов поиска (для использования с std::find_if) в мои конкретные типы.

Что-то вроде:

// Dummy example
class Foo
{
  public:
    class finder
    {
      public:

        finder(int value) : m_value(value) {};

        bool operator()(const Foo& foo) { return (foo.m_int_value == value); }

      private:

        int m_value;
    };

   private:

     int m_int_value;

     friend class finder;
};

Тогда:

vector<Foo> foo_list;
vector<Foo>::iterator foo = 
  std::find_if(foo_list.begin(), foo_list.end(), Foo::finder(4));

Конечно, это можно сделать без использования вложенных классов. Но я нахожу это довольно элегантным, потому что искатель не имеет смысла вне определения класса:

Если я когда-либо удаляю класс в случае рефакторинга кода, также должен быть удален искатель.

1 голос
/ 04 октября 2010

Я использую их редко по следующим причинам:

  • Они, как правило, являются деталями реализации, которые мне не нравятся в заголовочном файле.
  • Мне не нравится синтаксис.

Иногда я использую встроенные структуры (для POD, без методов).

0 голосов
/ 04 октября 2010

Я использую их как служебные классы, которым требуется доступ к моему классу: обработчики сигналов, таймеры, особенно при использовании pimpl, поэтому реализация уже находится в cpp-файле.
В C ++ нет ничего, что нельзя сделать без вложенных классов, но это хороший способ ограничить область действия этими классами, которые в основном просто отправляют события в мой класс.

0 голосов
/ 04 октября 2010

Они полезны, когда класс должен содержать сгруппированные / инкапсулированные данные. Вы можете создать все это для вложенного класса private, чтобы предотвратить непреднамеренное использование этого типа данных внешним миром.

Это также может быть использовано как более понятный способ достижения дружбы. Вложив класс вместо дружбы, вы дополнительно инкапсулируете отношения friend между частями кода.

...