У меня есть заголовок класса:
class Game {
static Game instance;
}
И я хочу установить "экземпляр" для "этого" объекта при создании экземпляра, но не могу заставить его работать.
Здесь моя реализация:
Game::Game() {
Game::instance = this;
}
Visual Studio дает красную игрушечную вещь на операторе =
говоря:
Error: no operator "=" matches these operands
operands are types are: Game = Game *
Обновить
Я не понял ошибку, но я попытался изменить код назначения на это:
Game::instance = * this;
И ошибка исчезла.
Итак, теперь мне интересно, в чем разница между этими двумя утверждениями assignment
?
Я думаю, что я знаю... но объяснение было бы неплохо.
Похоже, вы идете за одноэлементным узором! Найдите его для чтения. Некоторым людям это не нравится, и я никогда не использовал их, но если вы этого хотите, вам понадобится больше рамок, чем у вас. Обратите внимание: this
не существует, пока вы не создали объект. Также будьте осторожны, если вы используете =*this
вы сделаете копию.
Если вы хотите, чтобы ваш instance
был доступен с самого начала программы, вы, возможно, должны просто объявить глобальный экземпляр класса, это проще и безопаснее. Шаблон singleton предназначен для тех случаев, когда требуется замедленное создание экземпляра или дополнительный экземпляр вашего класса.
Должно быть
static Game* instance; // a pointer
Теперь instance
указывает на вновь созданный экземпляр.
Если вы сделаете это:
Game::instance = *this;
instance
присваивается "моментальный снимок" текущего состояния нового объекта. Это, вероятно, не то, что вы хотите.
instance
- объект. this
указатель на текущий объект. Используя * this
, вы разыменовываете свой указатель, следовательно, возвращаете pointee (= текущий объект)