Подтвердить что ты не робот

Может ли быть два открытых раздела в классе? Если да, то почему? И в каких обстоятельствах мы это делаем?

Есть что-то, что подтачивает меня по классам. Например

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

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

public:
  UINT a;
  ULONG b;
};

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

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

Однако есть несколько трюков:

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

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