Правило 1:
Минимум включений в *.h файл. Лучше всего в любом классе все поля делать указателями и использовать предварительные объявления: class <имя>.
Подключая *.h в файле реализации по мере надобности.
Исключения составляют библиотечные файлы (STL, ATL и т.д.). Их тоже можно подключать в *.cpp, но мы не всегда знаем, что конкретный тип данных описан как class <имя>. Он может быть typedef, как std::string, и проект не скомпилируется.
Пример:
-
mininc.h
-
#include <string> //string - из библиотеки STL, поэтому подключаем здесь
using namespace std;
class MyClass; //предварительное объявление, без него компилятор не будет знать, что делать
class MinInc {
private:
string m_str;
MyClass* m_pMyClass;
public:
MinInc();
virtual ~MinInc();
void doSome();
};
-
MinInc.cpp
-
#include "MyClass.h" //подключаем наш файл
MinInc::MinInc() {
m_str = "hello world!";
m_pMyClass = new MyClass; //такую реализацию конструктора записать в *.h файле, как любят некоторые, не получится
}
MinInc::~MinInc() {
delete m_pMyClass; //не забываем удалять, или используйте лучше boost::shared_ptr
}
void MinInc::doSome() {
delete m_pMyClass;
m_pMyClass = new MyClass(5);
}
Если остались вопросы - советую почитать "Эффективное программирование" С. Майерс