2014-10-27 2 views
2

На днях один пользователь прокомментировал another question of mine: «Все, что вы называете декларациями в вашем коде, - это фактически определения». Я решил потратить некоторое время, чтобы понять разницу между обеими концепциями.Правильно ли определять классы в файлах заголовков?

Учитывая код ниже:

test.hpp

class Test 
public: 
    Test(); 
}; 

test.cpp

#include "test.hpp" 
Test::Test() 
{ 
    // code 
} 

main.cpp

#include "test.hpp" 
int main() 
{ 
    Teste objTest = Test(); 
    return 0; 
} 

Вопрос 1: Из моего понимания, заголовочный файл test.hppопределяет класс с именем Test (на основе this answer). Это верно?

Вопрос 2: Мой код основан на общие практиках (я видел несколько библиотек с открытым исходным кодом следующих этой моделью), который, кажется, против правила "заголовков должны содержать только объявления, все определения должны быть в .cpp-файле ". Но приемлемо ли это? Если нет, как точно следует написать декларации/определения классов должным образом?

+2

* «... это противоречит правилу» заголовки должны содержать только декларации; все определения должны быть в .cpp файле "* - Это относится к ** объектам ** и ** функциям **. (public) Классы должны быть определены в заголовочных файлах. Как и * templates * и * inlines *. – Galik

ответ

1

Ответ 1: Технически, да. Ваш заголовочный файл определяет ваш класс, но это нормально. Определение вашего класса содержит декларации нескольких методов класса, и это важно в отношении вопроса declare vs. define.

Ответ 2: Правильно: ваш файл test.hpp содержит декларации методов тестирования, которые определены в файле test.cpp. Это нормально для файла заголовка, чтобы определить класс, который состоит из объявлений методов. Это не противоречит правилу; правило правильное, но в основном оно относится к методам класса.

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

1

Вопрос 1: Да, это правильно.

Вопрос 2: Да, это приемлемо. Все определение должно быть в файле .cpp.

Смежные вопросы