о заголовках в C ++, когда я должен их использовать? - PullRequest
0 голосов
/ 26 декабря 2011

Вопрос о заголовочных файлах в C ++: когда я должен их использовать. Если я пишу небольшую программу, я должен создать заголовочный файл или я могу просто объявить свои классы в файлах .cpp? Что такое хорошая практика? Если вы дадите ссылки на статьи об этом, было бы хорошо. Я не мог найти хорошие.

Ответы [ 3 ]

2 голосов
/ 26 декабря 2011

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

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

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

ОК - много словоблудия.Конкретный пример:

source1.h

extern int somefunc(int, int);

source1.cpp

#include "source1.h"

int somefunc(int a, int b)
{
    return a + b;
}

program.cpp

#include <iostream>
#include "source1.h"
using namespace std;

int main()
{
    int x = somefunc(1, 3);
    cout << "somefunc(1, 3) is " << x << endl;
}

Заголовок здесьНеобходимо обеспечить уверенность в том, что все соответствует.И source1.cpp, и program.cpp должны включать заголовок для обеспечения согласованности.

Обратите внимание, что если бы somefunc() было определено в program.cpp, не было бы никакого смысла в предоставлении заголовка.

Теперь предположим, что мы изменили somefunc():

source1.cpp - исправлено

#include "source1.h"
#include <iostream>
using namespace std;

int somefunc(int a, int b)
{
    cout << "a = " << a << ", b = " << b << endl;
    int x = a + b;
    cout << "x = " << x << endl;
    return x;
}

Внешне вы можете изменить source1.h, чтобы оно включало <iostream>, но это было бы плохопереехать.Интерфейс определенной функции, somefunc(), не зависит от <iostream>, поэтому заголовок не должен включать <iostream>.

2 голосов
/ 26 декабря 2011

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

Правило, которое я использовал перед " всегда использовать их " было: любой cpp, чьи функции доступны из других файлов cpp, должен использовать файл заголовка для "экспорта" функций .

Рекомендация: всегда используйте заголовочные файлы.

1 голос
/ 26 декабря 2011

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

...