Должен ли я использовать как заголовочные файлы, так и файлы cpp / source? - PullRequest
3 голосов
/ 30 апреля 2011

У меня есть файл Mammal.h, который гласит:

#ifndef MAMMAL_H
#define MAMMAL_H

class Mammal
{
public:
    void Speak();
};

#endif

Мой файл CPP выглядит так:

#include "stdafx.h"
#include "Mammal.h"
#include <iostream>

void Mammal::Speak()
{
    using namespace std;

    cout << "Speaking";
}

И мое использование этого кода видно здесь:

#include "stdafx.h"
#include "Mammal.h"

int main()
{
    Mammal *mammal = new Mammal();

    mammal->Speak();
}

Однако я мог бы сделать это в заголовочном файле:

#include "stdafx.h"
#include <iostream>

#ifndef MAMMAL_H
#define MAMMAL_H

class Mammal
{
public:
    void Speak()
    {
        using namespace std;

        cout << "Speaking";
    }
};

#endif

Я действительно не определил предпочтения ... но я вижу, что оба работают. Есть ли преимущества или недостатки любого из этих подходов?

Ответы [ 2 ]

3 голосов
/ 30 апреля 2011

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

2 голосов
/ 30 апреля 2011

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

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

...