Как средствами C++ создать экземпляр класса, видимого из методов другого класса?

Собственно, как сделать объект доступным в любом месте?

Первое, что пришло на ум:
CGameHud* CGameHudInstance;

int main(int argc, char** args)
{
	CGameHudInstance = new CGameHud(argc, args);
	return 0;
}


Но в других файлах CGameHudInstance уже не виден.
  • Вопрос задан
  • 8553 просмотра
Решения вопроса 2
@hsc
full stack python back-end developer
Строго говоря, использование глобальных переменных в С++ встречается редко. Это допустимо, но по большей мере для обеспечения совместимости с С. В С++ для передачи контекста используют другие приемы, например "передачу по указателю" (ниже). Стоит также сказать, что глобальные переменные сопряжены с кое-какими нюансами, например, могут возникнуть проблемы с последовательностью инициализации.

Но, судя по Вашему вопросу, Вам не нужны глобальные переменные. Достаточно будет кода на подобие этого:

/* 
 * gameinstancehandler.h 
 */

class GameInstanceHandler{
public:
    GameInstanceHandler(CGameHud *instance):
        mInstance(instance){}

private:
    CGameHud *mInstance;
    // something other here
}


#inlucde <gameinstancehandler>

int main(int argc, char **args){
    CGameHudInstance *gameHub = new CGameHud(argc, args);
    GameInstanceHandler *handler = new GameInstanceHandler(gameHub);

    return 0;
}


Здесь контекст передается по указателю. Объекты, поведение которых зависит от других, уже созданных объектов, просто получают указатели на них в конструкторе, сохраняют его "у себя" и взаимодействуют с ними через сохраненную копию указателя.

P.S. Поскольку вопрос новичковый, позволю себе дать еще один совет: во время объявления указателя пишите звездочку перед идентификатором, а не после типа.
int *a; // хорошо, a — это указатель.
int* b; // плохо, но допустимо.
int* c, d; // совсем плохо, c — указатель на int, d — просто переменная типа int.

int *e, *f; // при такой же записи все понятно сразу.
Ответ написан
Комментировать
Trrrrr
@Trrrrr
1) CGameHud* CGameHudInstance; можешь хранить где то в хедер файле, который всем доступен:
extern CGameHud* CGameHudInstance;
в цппшнике только не забудь написать
CGameHud* CGameHudInstance = 0;

Создаешь его как и создавал, важно не забыть убить его в конце работы программы, иначе будет утечка.

2) Обьяви класс синглетоном ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%B8%D0%BD%D0%... .

Если класс не твой, то можешь сделать другой класс синглетоном, который его будет возвращать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Free_ze
Пишу комментарии в комментарии, а не в ответы
Судя по примеру, здесь нужен синглтон.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы