Определение функции-члена - PullRequest
6 голосов
/ 29 января 2011

Какой правильный подход выбрать:

Определить функцию члена (класса) внутри класса?

Определить функцию члена (класса) снаружи класс?

Спасибо.

Ответы [ 6 ]

9 голосов
/ 29 января 2011

Предположим, вы говорите об этих трех возможностях:

  1. Метод, определенный в определении класса в файле заголовка.
  2. Метод определения внешнего определения класса в файле заголовка.
  3. Метод определения внешнего определения класса в файле реализации.

Тогда руководящие указания по проекту и компании могут заставить вас использовать (1) или (3) всегда.

Когда у вас есть выборИМХО лучше всего адаптироваться к обстоятельствам, учитывая такие вещи, как

  • Хотите модуль только для заголовков?Тогда (1) по умолчанию, (2) возможно.
  • Является ли метод большим зверем?Тогда (2) или (3).
  • Шаблонный метод специализации?Тогда (2) или (3).
  • Есть проблема во время сборки (медленная сборка)?Обозначает (3).
  • Шаблон класса?(1) или, возможно, (2)

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

Приветствия& hth.,

2 голосов
/ 29 января 2011

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

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

2 голосов
/ 29 января 2011

Если определение функции-члена не тривиально (в неформальном смысле) и не вводит никаких дополнительных зависимостей, я обычно определяю функцию-член вне тела класса в отдельном исходном файле.

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

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

1 голос
/ 29 января 2011

Если вы хотите определить функцию в классе, самый базовый синтаксис выглядит, как правило:

class Object
{
  int property;
  void doSomething()
  {
      property=100;
  }
};

Если вы хотите определить функцию за пределами , это похоже на объявление функций перед основными и в файлах библиотеки. В вашем классе у вас есть:

class Object
{
  int property;
  void doSomething();
};

Затем где-нибудь после вашего класса, после функции main () или во включенном файле вы можете получить определение:

void Object::doSomething()
{
  property=100;
}

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

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

1 голос
/ 29 января 2011

Вы имеете в виду "в объявлении класса / .h файле" vs "в файле .cpp, используя ::"?

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

0 голосов
/ 29 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...