Как я должен заказать членам класса C++?

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

, например, если вы пишете:

select dbo.prd.name
from dbo.product prd

, вы получите ошибка.

В таких ситуациях измените его на:

select prd.name
from dbo.product prd
57
задан Dan Olson 16 March 2009 в 10:01
поделиться

14 ответов

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

Как разработчик класса, Вы, вероятно, хорошо познакомитесь с его "внутренностями", но пользователи класса не очень заботятся, или по крайней мере они не были должны. Они главным образом интересуются тем, что класс может сделать для них, правильно?

, Таким образом, я поместил общественность сначала и обычно организую ее функцией/утилитой. Я не хочу, чтобы они должны были пробраться через мой интерфейс для нахождения всех методов связанными с X, я хочу, чтобы они видели все это вместе организованным способом.

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

50
ответ дан itsmatt 7 November 2019 в 16:01
поделиться

Зависит полностью от Вашего предпочтения. Существует не "правильный путь".

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

-3
ответ дан Marko 7 November 2019 в 16:01
поделиться

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

С современными IDE, люди не читают класс для выяснения то, что это - открытый интерфейс.

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

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

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

-1
ответ дан Scott Wisniewski 7 November 2019 в 16:01
поделиться

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

В этом, типы элемента и константы являются лучше всего первыми, сопровождаются операторами конструкции, операциями и затем членскими переменными.

1
ответ дан dcw 7 November 2019 в 16:01
поделиться

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

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

1
ответ дан Reed Hedges 7 November 2019 в 16:01
поделиться

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

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

1
ответ дан Todd 7 November 2019 в 16:01
поделиться

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

class Foo
{
private:
  int bar;

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

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

class Foo
{
public:
  typedef int bar_type;

private:
  bar_type bar;

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

участник bar_type используется панель участник, посмотрите?

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

1
ответ дан Dave Van den Eynde 7 November 2019 в 16:01
поделиться

На практике это редко имеет значение. Это - прежде всего, вопрос персонального предпочтения.

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

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

, Какой бы ни Вы выбираете, сделайте свои заголовки чистыми и легкими читать. Способность легко найти безотносительно информации, которую я, оказывается, ищу, являюсь ли я пользователем класса или специалистом по обслуживанию класса, является самой важной вещью.

2
ответ дан Dan Olson 7 November 2019 в 16:01
поделиться

я думаю, что это - все об удобочитаемости.

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

В целом, я чувствую, что самые важные вещи должны быть на первом месте. Для 99,6% всех классов, примерно, который означает открытые методы, и особенно конструктора. Тогда прибывает общедоступные элементы данных, если любой (помните: инкапсуляция является хорошей идеей), сопровождаемый любыми защищенными и/или закрытыми методами и элементами данных.

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

2
ответ дан unwind 7 November 2019 в 16:01
поделиться

Я обычно определяю сначала интерфейс (чтобы быть считанным), который общедоступен, затем защищенный, тогда частный материал. Теперь, во многих случаях я делаю шаг вперед и (если я могу обработать его), используют шаблон PIMPL, полностью скрывая весь частный материал от интерфейса реального класса.

class Example1 {
public:
   void publicOperation();
private:
   void privateOperation1_();
   void privateOperation2_();

   Type1 data1_;
   Type2 data2_;
};
// example 2 header:
class Example2 {
   class Impl;
public:
   void publicOperation();
private:
   std::auto_ptr<Example2Impl> impl_;
};
// example2 cpp:
class Example2::Impl
{
public:
   void privateOperation1();
   void privateOperation2();
private: // or public if Example2 needs access, or private + friendship:
   Type1 data1_;
   Type2 data2_;
};

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

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

4
ответ дан David Rodríguez - dribeas 7 November 2019 в 16:01
поделиться

Как всегда, запишите свой код для люди сначала . Рассмотрите человека, который будет использовать Ваш класс и помещать самый важный members/enums/typedefs/whatever в них наверху.

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

существуют некоторые исключения.

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

, Но они - относительно редкие ситуации.

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

, Но это - меньше об упорядочивании доступом и больше [приблизительно 113] упорядочивание интересом для потребителя .

5
ответ дан MattyT 7 November 2019 в 16:01
поделиться

Это - мое мнение, и я держал бы пари на предположение, что большинство людей согласится, что открытые методы должны пойти сначала. Один из базовых принципов OO - то, что Вам не придется заботиться о реализации. Просто рассмотрение открытых методов должно сказать Вам все, что необходимо знать для использования класса.

8
ответ дан korona 7 November 2019 в 16:01
поделиться

Польза Google этот порядок : "Определения типов и Перечисления, Константы, Конструкторы, Деструктор, Методы, включая статические методы, Элементы данных, включая статические элементы данных".

Matthew Wilson (требуемая подписка Safari) рекомендует следующий заказ: "Конструкция, Операции, Атрибуты, Повторение, состояние, Реализация, участники, и мой фаворит, чтобы Не быть реализованным".

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

37
ответ дан Ferdinand Beyer 7 November 2019 в 16:01
поделиться
2
ответ дан ayaz 7 November 2019 в 16:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: