Могут ли быть два открытых раздела в классе? Если да, то почему? И при каких обстоятельствах мы это делаем? - PullRequest
13 голосов
/ 27 апреля 2010

Что-то беспокоит меня в занятиях. Например

class A
{
public:
  A()
  {
  .....
  .....
  }

  void cleanup()
  {
  ....
  ....
  ....
  }

public:
  UINT a;
  ULONG b;
};

В приведенном выше примере есть два открытых раздела. В первом разделе я определяю конструктор и метод, а во втором разделе я объявляю элементы данных. Является ли вышеуказанный класс, т. Е. Правильным. Можем ли мы сделать это? Если да, то зачем это нужно и при каких обстоятельствах мы должны его использовать? Поскольку мы можем сделать все это в одном разделе, тогда почему есть два раздела?

Ответы [ 6 ]

27 голосов
/ 27 апреля 2010

Спецификаторы доступа просто применяются к коду, который следует до следующего классификатора. Нет ограничений на количество или порядок таких классификаторов.

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

11 голосов
/ 27 апреля 2010

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

class AClass
{
public:
   // all the public stuff
protected:
   // all the protected stuff
private:
   // all the private stuff
};

но лично (а это на самом деле просто личное предпочтение) мне нравится делать это:

class AClass
{
   // constructors and destructors
public:
   // public cons/dest
protected:
   // protected cons/dest
private:
   // private cons/dest

   // accessors
public:
protected:
private:

   // methods
public:
protected:
private:

   // members
public:
protected:
private:
};

Не стесняйтесь придумывать свой собственный стиль, с чем вам удобно. Нет правильного или неправильного способа сделать это. Просто старайся быть последовательным.

6 голосов
/ 27 апреля 2010

Да, это правильно, но лично я предпочитаю, чтобы в верхней части класса был только один публичный раздел, на который программисты смотрят первыми при изучении нового класса. Тогда легче увидеть, какие части должны быть доступны, а какие нет - вместо просмотра всего заголовка класса.

3 голосов
/ 27 апреля 2010

Я обычно стараюсь организовать объявление класса так, чтобы другим было легко использовать указанный класс.

Обычно это так: public/protected/private, в этом порядке, потому что это упрощает жизнь для читателей.

  • Люди, которые используют этот класс, могут перестать читать, как только они достигнут тега protected, что-нибудь после не будет их беспокоить.
  • Люди, унаследованные от класса, могут прекратить чтение, как только достигнет тега private, после чего все будет подробно.

Это, в сочетании с отсутствием написания кода методов в их точках объявлений, упрощает чтение интерфейса.

Однако есть несколько хитростей:

  • при использовании программирования метатемплат, вам может понадобиться сначала объявлять типы, а потом методы, так что в итоге вы получите 2 серии public/protected/private
  • при использовании идиомы Key (вместо friend) у вас есть секция public, которая фактически предназначена только для небольшой части пользователей и лучше изолирована либо внизу нормальной секции public или после секции protected.

Наконец, как прокомментировать проблему layout среди атрибутов. Инкапсуляция означает, что атрибуты должны быть private. Итак, либо у вас есть struct, и у вас есть public, либо у вас есть класс, и у вас есть private, смешивание двух означает нарушение инкапсуляции, и это ошибка в процессе создания.

2 голосов
/ 27 апреля 2010

Как объясняет @ Марсело Кантос , это разрешено. При написании кода вы должны избегать этого, поскольку это может привести к путанице только тогда, когда другие читают ваш код. Единственное место, где я когда-либо видел это в реальной жизни, это код, сгенерированный различными мастерами MFC. Всякий раз, когда вы добавляете что-то в свой класс с помощью мастера, он просто добавляет дополнительный раздел в конец вашего класса.

2 голосов
/ 27 апреля 2010

Класс правильный, public - это просто квалификатор доступа и будет применяться до следующего квалификатора или до конца объявления класса. Нет ограничений на количество таких квалификаторов доступа (общедоступных, частных, защищенных), которые вы можете иметь в классе. Что касается того, почему это полезно, это помогает писать объявления классов так, как вы хотите. Например, я бы хотел, чтобы все функции-члены (публичные, защищенные или приватные) были объявлены перед, скажем, частными членами-данными.

...