Re[3]: Проблемма с заголовочными файлами
От: ssm Россия  
Дата: 24.04.03 08:12
Оценка:
Здравствуйте, Keeper_andrew, Вы писали:

K_>а что вы думаете насчет


K_>
K_>#pragma once
K_>


Непортабильно, этим все и сказано
Re[7]: Проблемма с заголовочными файлами
От: Кодт Россия  
Дата: 24.04.03 09:04
Оценка: 2 (1) +1
Здравствуйте, 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.h

template <.....> XXX::XXX() {...}
template <.....> void XXX::abcd() {...}
...

#endif


Если же класс / функция / глобальная переменная не шаблонная, то
— объявление — в заголовочном файле
— определение — в компилируемом.
Причем, хотя определение функции/переменной автоматически является объявлением,
очень рекомендуется включать "родной" заголовочник в компилируемый файл.
Это позволит ловить ошибки — расхождения между объявлением и определением.
... << RSDN@Home 1.0 beta 6a >>
Перекуём баги на фичи!
Re[4]: Проблемма с заголовочными файлами
От: UgN  
Дата: 24.04.03 09:27
Оценка:
Здравствуйте, ssm, Вы писали:


ssm>
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 файлах?
Re[5]: Проблемма с заголовочными файлами
От: ssm Россия  
Дата: 24.04.03 09:42
Оценка:
Здравствуйте, 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. Зачем мне каждый раз компилить файлы необходимые для реализации класса, если я клиент этого класса?
Re[5]: Проблемма с заголовочными файлами
От: Bell Россия  
Дата: 24.04.03 09:45
Оценка: +1
Здравствуйте, UgN, Вы писали:


UgN>И вообще, почему бы не указывать все необходимые для реализации класса ????.cpp заголовки только в ????.h файлах?


Потому что это приводит к увеличению взаимосвязей между модудями, и к увеличению времени перекомпиляции при изменении одного хедера.
Любите книгу — источник знаний (с) М.Горький
Re[6]: Проблемма с заголовочными файлами
От: UgN  
Дата: 24.04.03 09:49
Оценка:
Здравствуйте, 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?

Или я чего-то не догоняю?
Re[6]: Проблемма с заголовочными файлами
От: UgN  
Дата: 24.04.03 10:00
Оценка:
Здравствуйте, Bell, Вы писали:

B>Потому что это приводит к увеличению взаимосвязей между модудями, и к увеличению времени перекомпиляции при изменении одного хедера.


Ну, да, фигню спорол...
Re[7]: Проблемма с заголовочными файлами
От: ssm Россия  
Дата: 24.04.03 10:02
Оценка: 7 (1)
Здравствуйте, UgN, Вы писали:

UgN>Просто, если один и тот же заголовочный файл нужен и .cpp и .h, то почему бы не оставить его только в .h?

UgN>Или я чего-то не догоняю?

Можно и так, но если в включаемом фаеле есть страж, то он то все равно два раза невключится

Удалено избыточное цитирование. -- ПК.
Re[8]: Проблемма с заголовочными файлами
От: UgN  
Дата: 24.04.03 10:12
Оценка:
Здравствуйте, ssm, Вы писали:

UgN>Просто, если один и тот же заголовочный файл нужен и .cpp и .h, то почему бы не оставить его только в .h?

UgN>Или я чего-то не догоняю?

ssm>Можно и так, но если в включаемом фаеле есть страж, то он то все равно два раза невключится


Это да... Просто хотелось уточнить.
Re[4]: Проблемма с заголовочными файлами
От: Smok_er  
Дата: 24.04.03 11:14
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Keeper_andrew, Вы писали:


K_>а что вы думаете насчет


K_>
K_>#pragma once
K_>


ssm>Непортабильно, этим все и сказано


Странно конечно, но у меня вообще эта директива не работает. Т.е. хидер компилится столько раз, сколько было включений. У кого-нибудь было подобное?
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.