#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:
Бета-версия верна в том, что определение ваших функций в файле заголовка вызовет проблемы, когда ваш заголовок будет включен в несколько файлов.
Я бы также посоветовал вам разделить заголовок и реализацию на отдельные файлы в качестве просто хорошей практики кодирования. Заголовочный файл представляет «интерфейс» класса. Общедоступные функции — это то, что доступно пользователям класса, а заголовок предоставляет людям краткий способ просмотра функций, не заботясь о реализации. Кроме того, это дает вам возможность изменять реализацию, не затрагивая вызывающих пользователей, потому что они включают только заголовок, а реализация обычно представляет собой просто библиотеку, на которую устанавливается ссылка.