Я хочу это класс, который содержит объекты и переменные, к которым может обращаться любой другой класс, без необходимости создания объекта этого класса или получения ссылки на этот объект из класса, который его создает. Я знаю, что в Java может просто создать статический класс, который бы это сделал, но в C++ не существует статических классов. Как я могу это сделать?
Позвольте мне уточнить, что именно я ищу.
Скажем, у меня есть класс под названием "моб", который при обновлении ищет игрока и движется к нему. Я мог бы сделать это, поставив ссылку на игрока в функции обновления для моба или, лучше всего, просто создав указатель в классе mob, которому назначена ссылка игрока на инициализацию. Тем не менее, я действительно хочу просто включить заголовок, например "Global.h", и поставить там игрока. Затем, когда моб или любой другой объект в программе хочет получить некоторые данные от игрока, он может просто использовать что-то вроде Global.player.GetPos()
Или, может быть, это ужасная практика, о которой я должен сейчас забыть. В этом случае, пожалуйста, скажите мне, как лучше всего это сделать. Благодарю.
Вы можете использовать эфир в одноэлементном шаблоне (вы можете найти его много, как упоминал Нил Кирк в своем комментарии выше), или, если вам не нужна объектно-ориентированная механика (например, наследование или полиморфность), я лично привык к простому используя простые функции вместо класса.
Mob.hpp
#ifndef MOB_HPP
#define MOB_HPP
namespace Mob {
// "public" functions and variables
extern int someVariable;
extern void moveTowards(Player* player);
extern void retreat(void);
}
#endif
Mob.cpp
#include "Mob.hpp"
// "private" functions and variables
static long _lastUpdate;
static void seekOut(Player* player) {
//...
}
// "public" function implementation and variables
namespace Mob {
int someVariable = 0;
void moveTowards(Player* player) {
//...
}
void retreat(void) {
//...
}
}
Применение
#include "mob.hpp"
int var = Mob::someVariable;
Mob::moveTowards(player);
Заголовок в основном определяет все общедоступные методы, которые вы обычно используете в своем статическом классе. Они отмечены как extern
так что они имеют внешнюю связь и могут использоваться в других единицах компиляции.
В файле.cpp есть дополнительные вещи, помеченные как static
. Когда вы объявляете глобальные функции или переменные static
, они имеют внутреннюю связь и видны только в блоке, где они определены. Поэтому в некотором смысле они являются частными.
Некоторые считают этот подход более привлекательным, но, честно говоря, когда речь идет о одиночных играх без необходимости фактически использовать их как класс каким-то образом или получить указатель на экземпляр singleton, то функции просто более просты. Один из недостатков: если вы хотите, чтобы моб больше не был синглом, а являлся экземпляром объекта, вам придется писать класс позже.
extern
является допустимым спецификатором хранения для функций. Это избыточно, потому что в вышеприведенном случае по умолчанию оно имеет внешнюю связь, но оно не является недействительным.