У меня есть класс 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.Я знаю, что это плохая идея, но с этим огромным дизайном я не могу понять.Спасибо за вашу помощь.