Я запутался в том, как разделить код реализации и объявлений простого класса на новый заголовок и файл cpp. Например, как бы я отделил код для следующего класса?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
public:
членов наверху может сильно повлиять , если пользователь переместит их в соответствии с этим советом - но имел упорядочение зависимостей между членами и еще не знал, что члены инициализируются в порядке их объявления ;-)Ответы:
Объявление класса идет в заголовочный файл. Важно, чтобы вы добавили
#ifndef
защиту для включения, или если вы работаете на платформе MS, вы также можете использовать#pragma once
. Также я опустил приватный, по умолчанию члены класса C ++ являются приватными.и реализация идет в файле CPP:
источник
#ifndef
материал в шапке?В общем, ваш .h содержит определение класса, которое представляет собой все ваши данные и все ваши объявления методов. Вот так в вашем случае:
И тогда ваш .cpp содержит реализации таких методов:
источник
При более широком исследовании предмета важно указать читателям, которые наткнулись на этот вопрос, что процедура принятого ответа не требуется, если вы просто хотите разбить свой проект на файлы. Это нужно только тогда, когда вам нужно несколько реализаций отдельных классов. Если ваша реализация на класс одна, достаточно одного заголовочного файла для каждого.
Следовательно, из примера принятого ответа нужна только эта часть:
Определения препроцессора #ifndef и т. Д. Позволяют использовать его несколько раз.
PS. Тема становится понятнее, когда вы понимаете, что C / C ++ «тупой», а #include - это просто способ сказать «сбросить этот текст в этом месте».
источник
.cpp
, или это.h
действительно «хорошо» для этого метода организации кода?В основном модифицированный синтаксис объявления / определения функций:
a2dd.h
a2dd.cpp
источник
A2DD.h
A2DD.cpp
Идея состоит в том, чтобы сохранить все сигнатуры функций и членов в заголовочном файле.
Это позволит другим файлам проекта видеть, как выглядит класс, не зная реализации.
И, кроме того, вы можете включить другие заголовочные файлы в реализацию вместо заголовка. Это важно, потому что любые заголовки, включенные в ваш заголовочный файл, будут включены (унаследованы) в любой другой файл, содержащий ваш заголовочный файл.
источник
Вы оставляете объявления в заголовочном файле:
И поместите определения в файл реализации.
Вы можете смешать два (например, оставить
getSum()
определение в заголовке). Это полезно, так как это дает компилятору больше шансов на встраивание, например. Но это также означает, что изменение реализации (если оставить ее в заголовке) может вызвать перестройку всех других файлов, которые содержат заголовок.Обратите внимание, что для шаблонов вам нужно хранить все это в заголовках.
источник
Обычно вы помещаете в заголовочный файл только объявления и действительно короткие встроенные функции:
Например:
источник
Я не буду ссылаться на ваш пример, так как он довольно прост для общего ответа (например, он не содержит шаблонных функций, которые вынуждают вас реализовывать их в заголовке), что я следую, как практическое правило, это pimpl идиома
Он имеет некоторые преимущества, поскольку вы получаете более быстрое время компиляции и синтаксический сахар:
class->member
вместо тогоclass.member
Единственным недостатком является дополнительный указатель, который вы платите.
источник