Здравствуйте, e-buch, Вы писали:
EB>Ворос по теме — как лучше организовать проект ? EB>1. определение и реализация класса в одном файле *.h EB>2. определение и реализация класса в двух файлах *.h & *.cpp
Если класс шаблонный — то его объявление и определение должны быть в заголовочном файле. Иногда, для красоты, делают так:
// class.h#ifndef __class_h__
#define __class_h__
template <.....> class XXX
{
.......
};
...
#include"class_impl.h"#endif/////////////////////////////////////
// class_impl.h#ifndef __class_impl_h__
#define __class_impl_h__
#include"class.h"// на тот случай, если кто-то захочет включить
// class_impl.h без class.htemplate <.....> XXX::XXX() {...}
template <.....> void XXX::abcd() {...}
...
#endif
Если же класс / функция / глобальная переменная не шаблонная, то
— объявление — в заголовочном файле
— определение — в компилируемом.
Причем, хотя определение функции/переменной автоматически является объявлением,
очень рекомендуется включать "родной" заголовочник в компилируемый файл.
Это позволит ловить ошибки — расхождения между объявлением и определением.
ssm>//first.h
ssm>#ifdef __first_h__
ssm>#define __first_h__
ssm>#include <windows.h> //если для декланации класса First надо windows.h
ssm>#include <D3D8.h> //если для декланации класса First надо D3D8.h
ssm>#include"second.h"//если для декланации класса First надо second.h
ssm>//декланация класса First
ssm>#endif//__first_h__
ssm>
ssm>
ssm>//First.cpp
ssm>#include"First.h"
ssm>#include <windows.h> //если для реализации класса First надо windows.h
ssm>#include <D3D8.h> //если для реализации класса First надо D3D8.h
ssm>#include"second.h"//если для реализации класса First надо second.h
ssm>//реализация класса First
ssm>
А зачем в First.cpp еще раз прописывать second.h, windows.h, D3D8.h ???
Они ведь уже есть в First.h, а First.h всегда будет включаться в First.cpp.
И вообще, почему бы не указывать все необходимые для реализации класса ????.cpp заголовки только в ????.h файлах?
Здравствуйте, UgN, Вы писали:
UgN>А зачем в First.cpp еще раз прописывать second.h, windows.h, D3D8.h ??? UgN>Они ведь уже есть в First.h, а First.h всегда будет включаться в First.cpp.
Так дело все в том, что если second.h, windows.h, D3D8.h нужны только для реализации то мы их в First.h не прописываем, их место только в First.cpp
UgN>И вообще, почему бы не указывать все необходимые для реализации класса ????.cpp заголовки только в ????.h файлах?
Потому, что:
1. Хидер будет полностью самодостаточен и без них
2. Зачем мне каждый раз компилить файлы необходимые для реализации класса, если я клиент этого класса?
Здравствуйте, ssm, Вы писали:
UgN>А зачем в First.cpp еще раз прописывать second.h, windows.h, D3D8.h ??? UgN>Они ведь уже есть в First.h, а First.h всегда будет включаться в First.cpp.
ssm>Так дело все в том, что если second.h, windows.h, D3D8.h нужны только для реализации то мы их в First.h не прописываем, их место только в First.cpp
Ну да, каждый .cpp и .h имеет необходимый и достаточный набор подключаемых заголовочных файлов.
Просто, если один и тот же заголовочный файл нужен и .cpp и .h, то почему бы не оставить его только в .h?
Здравствуйте, Bell, Вы писали:
B>Потому что это приводит к увеличению взаимосвязей между модудями, и к увеличению времени перекомпиляции при изменении одного хедера.
Здравствуйте, UgN, Вы писали:
UgN>Просто, если один и тот же заголовочный файл нужен и .cpp и .h, то почему бы не оставить его только в .h? UgN>Или я чего-то не догоняю?
Можно и так, но если в включаемом фаеле есть страж, то он то все равно два раза невключится
Здравствуйте, ssm, Вы писали:
UgN>Просто, если один и тот же заголовочный файл нужен и .cpp и .h, то почему бы не оставить его только в .h? UgN>Или я чего-то не догоняю?
ssm>Можно и так, но если в включаемом фаеле есть страж, то он то все равно два раза невключится