Должен ли я использовать оба файла заголовков и cpp / исходные файлы?

#c #header-files

#c #заголовочные файлы

Вопрос:

У меня есть файл 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
  

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

Комментарии:

1. пожалуйста, укажите код в вопросе

2. Я бы очень хотел это сделать, однако, когда я попытался это сделать, результаты были ужасными. Итак, для удобства других я использовал pastebay. Я согласен с вашей позицией, что код должен быть в вопросе (определенно самый простой для вас); однако я чувствовал, что вам могут не понравиться некоторые строки, выделенные жирным шрифтом, другие — нет, некоторые курсивом и т.д.

3. @Storm: Нет проблем. Чтобы отформатировать код в Stack Overflow, выберите его и нажмите {} кнопку или просто добавьте четыре пробела перед каждой строкой.

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

5. @icktoofay, Дэвид Хеффернан: Да, я попробовал кнопку {}, и она добавила символы », чтобы поместить мой код внутрь. Часть кода выглядела правильно, но части были неправильно отформатированы (большой жирный текст). Странно, но в следующий раз я попробую использовать предложение с пробелами. Еще раз спасибо вам!

Ответ №1:

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

Ответ №2:

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

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