Как сделать статические глобальные классы в C ++? (или я должен делать это по-другому?)

0

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

Позвольте мне уточнить, что именно я ищу.
Скажем, у меня есть класс под названием "моб", который при обновлении ищет игрока и движется к нему. Я мог бы сделать это, поставив ссылку на игрока в функции обновления для моба или, лучше всего, просто создав указатель в классе mob, которому назначена ссылка игрока на инициализацию. Тем не менее, я действительно хочу просто включить заголовок, например "Global.h", и поставить там игрока. Затем, когда моб или любой другой объект в программе хочет получить некоторые данные от игрока, он может просто использовать что-то вроде Global.player.GetPos()

Или, может быть, это ужасная практика, о которой я должен сейчас забыть. В этом случае, пожалуйста, скажите мне, как лучше всего это сделать. Благодарю.

  • 0
    Похоже, вы хотите синглтон. Помните, что синглтон - это просто глобальная переменная, и применяются те же соображения, что и к глобальным переменным.
  • 0
    Но разве мне не нужно объявлять синглтон перед его использованием? Как я должен сказать "Singleton Single;" а затем используйте «single.someVariable» для доступа к нему. Я хочу иметь возможность использовать "Singleton.someVarialbe."
Показать ещё 4 комментария
Теги:

1 ответ

1

Вы можете использовать эфир в одноэлементном шаблоне (вы можете найти его много, как упоминал Нил Кирк в своем комментарии выше), или, если вам не нужна объектно-ориентированная механика (например, наследование или полиморфность), я лично привык к простому используя простые функции вместо класса.

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, то функции просто более просты. Один из недостатков: если вы хотите, чтобы моб больше не был синглом, а являлся экземпляром объекта, вам придется писать класс позже.

  • 0
    Экстерьер функций неверен.
  • 0
    @NeilKirk extern является допустимым спецификатором хранения для функций. Это избыточно, потому что в вышеприведенном случае по умолчанию оно имеет внешнюю связь, но оно не является недействительным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню