Разделение кода класса в файл заголовка и cpp
Я путаюсь, как разделить код реализации и декларации простого класса на новый заголовок и файл cpp. Например, как я могу отделить код для следующего класса?
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y)
{
gx = x;
gy = y;
}
int getSum()
{
return gx + gy;
}
};
Ответы
Ответ 1
Объявление класса входит в заголовочный файл. Важно, чтобы вы добавили защитные элементы #ifndef
, или если вы находитесь на платформе MS, вы также можете использовать #pragma once
. Также я опустил закрытый, по умолчанию члены класса С++ являются частными.
// A2DD.h
#ifndef A2DD_H
#define A2DD_H
class A2DD
{
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};
#endif
и реализация идет в файле CPP:
// A2DD.cpp
#include "A2DD.h"
A2DD::A2DD(int x,int y)
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}
Ответ 2
В общем, ваш .h содержит класс defition, который является всеми вашими данными и всеми объявлениями вашего метода. Как это в вашем случае:
A2DD.h:
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};
И тогда ваш .cpp содержит реализации таких методов, как это:
A2DD.cpp:
A2DD::A2DD(int x,int y)
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}
Ответ 3
В основном модифицированный синтаксис объявления/определения функции:
a2dd.h
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};
a2dd.cpp
A2DD::A2DD(int x,int y)
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}
Ответ 4
A2DD.h
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y);
int getSum();
};
A2DD.cpp
A2DD::A2DD(int x,int y)
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}
Идея состоит в том, чтобы сохранить все сигнатуры функций и членов в файле заголовка.
Это позволит другим файлам проекта видеть, как выглядит класс, не зная реализации.
Кроме того, вы можете включить в заголовок другие файлы заголовков вместо заголовка. Это важно, потому что любые заголовки, включенные в ваш файл заголовка, будут включены (унаследованы) в любой другой файл, который включает ваш файл заголовка.
Ответ 5
Вы оставляете объявления в файле заголовка:
class A2DD
{
private:
int gx;
int gy;
public:
A2DD(int x,int y); // leave the declarations here
int getSum();
};
И поместите определения в файл реализации.
A2DD::A2DD(int x,int y) // prefix the definitions with the class name
{
gx = x;
gy = y;
}
int A2DD::getSum()
{
return gx + gy;
}
Вы можете смешать два (оставьте getSum()
определение в заголовке, например). Это полезно, так как дает компилятору больше шансов на inlining, например. Но это также означает, что изменение реализации (если осталось в заголовке) может привести к перестройке всех других файлов, содержащих заголовок.
Обратите внимание, что для шаблонов вам необходимо сохранить все в заголовках.
Ответ 6
Обычно вы помещаете в заголовочный файл только объявления и действительно короткие встроенные функции:
Например:
class A {
public:
A(); // only declaration in the .h unless only a short initialization list is used.
inline int GetA() const {
return a_;
}
void DoSomethingCoplex(); // only declaration
private:
int a_;
};