Вы хотите организовать свои #includes
(и библиотеки в этом отношении) в DAG (направленный ациклический граф). Это сложный способ сказать «избегать циклов между заголовочными файлами»:
Если B включает A, A не должно включать B.
Таким образом, использование "одного большого мастера main.h
" не является правильным подходом, потому что трудно включить только прямые зависимости.
Каждый файл .cpp должен включать свой собственный файл .h. Этот файл .h должен содержать только то, что ему самому нужно для компиляции.
Обычно нет main.h
, потому что main.cpp
никому не нужно определение main.
Кроме того, вам нужно, чтобы включали охрану , чтобы защитить вас от нескольких включений.
Например
//player.h
#ifndef PLAYER_H_
#define PLAYER_H_
#include "vector.h" // Because we use Vector
#include "health.h" // Because we use Health
class Player {
private:
Vector playerPos;
public:
Health playerHealth;
};
#endif
-
//vector.h
#ifndef VECTOR_H_
#define VECTOR_H_
struct Vector {
int X;
int Y;
int Z;
};
#endif
-
//health.h
#ifndef HEALTH_H_
#define HEALTH_H_
class Health {
private:
int curHealth;
int maxHealth;
public:
int getHealth() const;
void setHealth(int inH);
void modHealth(int inHM);
};
#endif
Единственный раз, когда вы хотите объединить несколько #include
с в один заголовок, это когда вы предоставляете его для удобства очень большой библиотеки.
В вашем текущем примере вы немного перегружены - каждому классу не нужен собственный заголовочный файл. Это может все идти в main.cpp.
Препроцессор c буквально вставляет файл из #include
в файл, который включает его (если он не был уже вставлен, поэтому вам нужны защитные элементы включения). Это позволяет вам использовать классы, определенные в этих файлах, потому что теперь у вас есть доступ к их определению.