2013-10-11 8 views
1

У меня есть небольшая проблема с файлами header и cpp, Я начал создавать небольшую текстовую игру, и я хотел сделать работу более понятной, создав больше файлов и разделенных файлов для каждого класса (Player.cpp, Monster.cpp Entity и т. д.).Как обрабатывать файлы cpp и файлы заголовков

Итак, у меня получилось много #include директива в каждом файле cpp (я еще не использовал заголовки).

мне нужна была функция рэнд так я добавил STDLIB к каждому классу, и iostream в классе игроков и т.д ..

так я закончил с большим количеством двойных и тройных использований той же библиотеки, что я должен сделать, чтобы избежать этого? Есть ли способ избежать этого вообще? (создание отдельного класса для случайных, например, не работает, потому что мне нужно добавить его в классы, а также любым способом).

Заранее благодарен!

EDIT: Но если у меня есть что-то вроде этого ?:

main.cpp -> Player.h -> stdlib.h

 -> Monster.h -> stdlib.h 

что я могу сделать, чтобы сделать stdlib.h быть во всех классах без предупреждения или ошибок?

Другими словами, как я могу создать заголовок без включения в него одной и той же библиотеки? (Player и Monster - разные классы, и им обоим нужен stdlib, что мне делать, чтобы включить только одну библиотеку?)

+1

Сначала введите заголовки, используя [include guard] (http://en.wikipedia.org/wiki/Include_guard). Во-вторых, вы можете вложить свои вложения - например, написать (значимый) заголовочный файл, например. Player.h, включая только заголовки, необходимые для компонента Player. Таким образом, компоненты, использующие Player, должны включать только Player.h ... и не все, что используется для реализации Игрока, которые могут измениться. – Jost

+0

Я читаю книгу под названием C++ для нетерпеливых, но они не научили меня, как ее использовать, или сказали мне использовать ее. Я просто хотел сделать это более понятным для меня. Есть ли какой-нибудь учебник для этого? –

+1

Для книг и руководств вы можете ознакомиться с известным списком [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). .. Поднимите подбородок вверх ;-) – Jost

ответ

1

Что вы имеете в виду «Я не использовал заголовки еще «? Вы должны создать заголовки для описания функций/определений классов. Другого разумного пути нет.
Далее вы должны прочитать о include guards. Включите защиту, чтобы заголовок не включался более одного раза, прямо или косвенно.
Практически во всех современных компиляторах вы можете использовать #pragma once вместо старого #if !defined ... style.

+2

Следует, однако, подчеркнуть, что '#pragma once' является ** не ** стандартным C++; '#if! defined' является и широко используется в новом коде, несмотря на пренебрежительное прилагательное« старый ». –

+0

Пит правильный. Я просто хотел немного упростить вещи. – cdoubleplusgood

+0

@PeteBecker Лучше использовать оба варианта, потому что некоторые компиляторы не распознают include guard и не смогут использовать определенные оптимизации, связанные с файлами заголовков. – Overv

1

Это может быть не лучший способ, но это так, как я это делаю У меня всегда есть главная .cpp-файл, который называется файлом «MasterHeader.h», и внутри этого заголовочного файла у меня есть все остальные заголовки, поэтому в основном у меня есть только одна строка, которая вызывает все мои другие заголовки, и этот заголовок сортирует, какие заголовки мне нужны.

Так

main.cpp> MasterHeader.h> myHeader.h, myOtherHeader.h, thisHeader.h

Etc

+0

Это также метод, который я использую. Плюсы: организация и включение заголовков просты. Минусы: если ваша система сборки не очень умна, вам нужно перекомпилировать все, когда заголовок изменяется. Пока ваша программа не огромна, последний бит не так уж плох. – Max

1

Исправьте меня, если я ошибаюсь ... Ваши обратные ошибки переопределения из-за включения ваших собственных файлов cpp в несколько точек.

Один из способов - создать заголовок для файлов кода, которые необходимо включить в другое место, и объявить экспорт в этом заголовке.Убедитесь в том, что экспорт определяются один раз на созданный объект, используя препроцессор

// some_file.h 
#ifndef SOME_FILE_H 
#define SOME_FILE_H 
... 
//export declarations 
... 
#endif 

или избежать, включая файлы кода и объявить функции, необходимые как «Экстерн»

//your_functions.cpp 
int some_function(int arg1) 
{ 
    ... 
} 

и

//other_file.cpp 
extern int some_function(int); 
+0

Я думаю, что ваш последний фрагмент кода неверен. Почему вы объявляете указатель на функцию? Кроме того, для объявлений функций 'extern' не требуется. – cdoubleplusgood

+0

Имена, начинающиеся с символа подчеркивания, за которым следует большая буква ('_SOME_FILE_'), и имена, содержащие два последовательных символа подчеркивания, зарезервированы для реализации. Не используйте их. –

+0

О, дерьмо, ты прав. Я подумал, что это важно, но в этом случае вам не нужно объявлять указатель –

Смежные вопросы