Класс Singleton, ctor которого требует аргументов - PullRequest
2 голосов
/ 16 декабря 2010

У меня есть класс Command, который является экземпляром класса EventManager.Класс Class требует два аргумента (host, target) в своем конструкторе.

class EventManager
{
public:
   void Event1(){ cmd->Execute(_eventEnum); }
private:
   Command *cmd;
};

class Command
{
public:
   Command(Host h, Target t)
   void Execute();
private:

}

Теперь, если мне нужно использовать этот метод cmd->Execute() в функции-члене класса Target, мне нужно сделатьcmd переменная экземпляра Target или сделать ее глобальной как синглтон.

Я не могу сделать cmd переменную экземпляра Target, поскольку она не принимает экземпляр хоста.Чтобы сделать его единичным, нужно добавить два таких метода:

class Command
{
public:

   CreateInstance(Host h, Target t);
   GetInstance(); 
   void Execute();
private:
   Command(Host h, Target t);

}

. Мне нужно убедиться, что GetInstance вызывается после CreateInstance.Любая другая альтернатива?

Целевой класс - это класс низкого уровня с несколькими событиями.

Target::LowlevelEvent()
{
 cmd->Execute(lowlevelevent) //In Execute for lowlevelevent in Command class, i might call target->reset
}

Извините, что не смог объяснить четко.Проблема в том, что в этом коде много событий (методов), которые могут быть в таких классах, как EventManager или Target.

В каждом из этих событий мне нужно было бы вызывать Command-> Execute ().Командному классу требуются экземпляры хоста и назначения, поскольку они могут выполнять определенные действия.

EventManager :: Event1 () {cmd-> Execute (_event1);}

Target :: Event2 () {cmd-> Execute (_event2);}

Command :: Execute (События e) {if (_event1 == e) {host-> CallAction ();} if (_event2 == e) {target-> CallSomeOtherAction ();}
}

Итак, теперь cmd должен быть переменной экземпляра EventManager и Target, верно?Теперь в EventManager есть экземпляр host и target, который можно передать в Command ctor.

Но у Target нет доступа к host.Поэтому я не могу создать экземпляр Command в классе Target.

Поэтому мне было интересно, создаю ли я синглтон в ctor EventManager.А затем вызовите GetInstance () в Target.Я знаю, что это плохая идея, но с этим огромным дизайном я не могу понять.Спасибо за вашу помощь.

Ответы [ 2 ]

5 голосов
/ 16 декабря 2010

Я действительно не понимаю вашей проблемы, но, исходя из названия, могу сказать следующее: Не используйте синглтон . Тот факт, что он требует аргументов, является довольно хорошим контр-индикатором для шаблона синглтона.

Если вы хотите убедиться, что все команды созданы с одинаковыми параметрами, вы можете предоставить клиенту CommandFactory, который создает экземпляры команд.

class CommandFactory {
public:
    CommandFactory(std::string host, std::string target)
        : m_host(host),
          m_target(target)
    {}

    boost::shared_ptr<Command> createCommand() {
        return boost::shared_ptr<Command>(new Command(m_host, m_target));
    }
private:
    std::string m_host;
    std::string m_target;
};

Тогда вы могли бы также реализовать некоторый пул объектов для повторного использования объектов.

0 голосов
/ 16 декабря 2010

Совершенно не нужно делать Command синглтоном.Просто создайте экземпляр с нужными параметрами по мере необходимости, передайте его менеджеру, используйте его и избавьтесь от него.Вы, вероятно, хотите передать его, поэтому рекомендуется использовать shared_ptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...