Как я должен заказать членов класса C ++? - PullRequest
54 голосов
/ 21 ноября 2008

Лучше ли иметь всех частных участников, затем всех защищенных, а затем всех публичных? Или наоборот? Или должно быть несколько частных, защищенных и общедоступных меток, чтобы операции можно было отделить от конструкторов и т. Д.? Какие вопросы я должен учитывать при принятии этого решения?

Ответы [ 15 ]

1 голос
/ 21 ноября 2008

Обратите внимание, что (в зависимости от вашего компилятора и динамического компоновщика) вы можете сохранить совместимость с предыдущими версиями совместно используемой библиотеки, только добавляя в конец класса (то есть в конец интерфейса), а не удаляя или изменяя что-нибудь еще. (Это верно для G ++ и libtool, и схема управления версиями из трех частей для разделяемых библиотек GNU / Linux отражает это.)

Существует также идея, что вы должны упорядочить членов класса, чтобы избежать потери пространства из-за выравнивания памяти; Одна стратегия состоит в том, чтобы заказать членов от самого маленького до самого большого размера. Я никогда не делал этого ни в C ++, ни в C.

1 голос
/ 21 ноября 2008

Это действительно полезно для людей, которые будут использовать ваш класс, чтобы сначала вывести общедоступный интерфейс. Это та часть, о которой они заботятся и могут использовать. За ним могут следовать охраняемые и частные лица.

В общедоступном интерфейсе удобно группировать конструкторы, средства доступа и мутаторы свойств и операторы в отдельные группы.

1 голос
/ 21 ноября 2008

В нашем проекте мы заказываем участников не по доступу, а по использованию. И под этим я подразумеваю, мы заказываем участников, поскольку они используются. Если открытый член использует закрытый член в том же классе, этот закрытый член обычно находится где-то перед открытым членом, как в следующем (упрощенном) примере:

class Foo
{
private:
  int bar;

public:
  int GetBar() const
  {
    return bar;
  }
};

Здесь член bar ставится перед элементом GetBar () , поскольку первый используется последним. Это может привести к нескольким разделам доступа, как в следующем примере:

class Foo
{
public:
  typedef int bar_type;

private:
  bar_type bar;

public:
  bar_type GetBar() const
  {
    return bar;
  }
};

Элемент bar_type используется элементом bar , видите?

Почему это? Не знаю, казалось более естественным, что если вы встретите члена где-то в реализации, и вам нужно больше информации об этом (и IntelliSense снова облажался), вы сможете найти его где-то выше, где вы работаете.

0 голосов
/ 16 марта 2009

Поставьте личные поля первыми.

В современных IDE люди не читают класс, чтобы понять, что это за открытый интерфейс.

Они просто используют для этого Intellisence (или браузер классов).

Если кто-то читает определение класса, обычно это потому, что он хочет понять, как оно работает.

В этом случае знание полей помогает больше всего. Он говорит вам, каковы части объекта.

0 голосов
/ 21 ноября 2008

полностью зависит от ваших предпочтений. Нет «правильного пути».

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

...