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

<form>
    <fieldset disabled>
        <input type="text">
        <input type="radio">
        <input type="checkbox">
    </fieldset>
</form>

, вероятно, лучший способ сделать это

6
задан 23 May 2009 в 20:32
поделиться

5 ответов

Это плохая практика?

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

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

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

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

11
ответ дан 8 December 2019 в 16:09
поделиться

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

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

Когда вы становитесь больше, разделение кода на функции помогает организовать вещи.

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

Более того, помогают пространства имен.

Иногда проще всего написать функцию, которая что-то делает. Это часто бывает, когда вы пишете функцию, которая работает только с примитивными типами (например, int). int не делает У t есть класс, поэтому, если вы хотите написать функцию printInt (), вы можете сделать ее автономной. Кроме того, если функция работает с объектами из нескольких классов, но на самом деле не принадлежит ни к одному классу, ни к другому, это может иметь смысл как отдельная функция. Это часто случается, когда вы пишете такие операторы, как define less, чтобы сравнивать объекты двух разных классов. Или, если функция может быть написана в терминах общедоступных методов класса и не требует прямого доступа к данным класса, некоторые люди предпочитают писать это как отдельную функцию.

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

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

4
ответ дан 8 December 2019 в 16:09
поделиться

H-файл - это просто способ включения набора объявлений. Многие вещи в C ++ являются полезными объявлениями, включая классы, типы, константы, глобальные функции и т. Д.

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

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

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

Однако, C ++ предоставляет возможности пространств имен, и часто он используется так же, как класс, который будет использоваться в этих ситуациях - для группировки набора автономных элементов, где каждому элементу предшествует имя «пространства имен». Как отмечают другие, многие функции стандартной библиотеки C ++ расположены именно так. Я считаю, что это очень похоже на использование класса в Java. Однако другие будут утверждать, что Java использует классы, потому что у нее нет пространств имен. Пока вы используете одну или другую (а не плавающую автономную функцию без пространства имен), у вас обычно все будет в порядке.

1
ответ дан 8 December 2019 в 16:09
поделиться

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

Давайте проясним ситуацию.

определения методов в файлах заголовков

Это означает примерно следующее: файл "Ах":

class A {
void method(){/*blah blah*/} //definition of a method
};

Это то, что вы имели в виду?

Позже вы говорите "объявить файл заголовка". В C ++ нет механизма ОБЪЯВЛЕНИЯ файла. Файл можно ВКЛЮЧИТЬ, набрав #include "filename.h" . Если вы сделаете это, содержимое файла заголовка будет скопировано и вставлено туда, где у вас есть указанная выше строка, прежде чем что-либо будет скомпилировано.

Таким образом, вы имеете в виду, что все определения находятся в определении класса (нигде в Ah FILE, но особенно в классе A, который ограничен 'class A {' и '};'). Следствием наличия определения метода в определении класса является то, что метод будет «встроенным» (это ключевое слово C ++), что означает, что тело метода будет вставлено при каждом вызове к нему. Это:

  • хорошо, потому что механизм вызова функции больше не замедляет выполнение
  • плохо, если функция длиннее короткого оператора, потому что размер исполняемого кода сильно увеличивается

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

0
ответ дан 8 December 2019 в 16:09
поделиться

В C ++ функции не обязательно должны быть членами классов.

-1
ответ дан 8 December 2019 в 16:09
поделиться
Другие вопросы по тегам:

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