我有类Command
,它是类EventManager
的实例。类 Command 在其构造函数中需要两个参数(host
、target
)。
class EventManager
{
public:
void Event1(){ cmd->Execute(_eventEnum); }
private:
Command *cmd;
};
class Command
{
public:
Command(Host h, Target t)
void Execute();
private:
}
现在,如果我需要在 Target 类的成员函数中使用此方法 cmd->Execute()
,我需要使 cmd
成为 Target 的实例变量或使其作为单例全局。
我无法将 cmd
设置为 Target 的实例变量,因为它不采用主机实例。要使其成为单例,需要添加两个这样的方法
class Command
{
public:
CreateInstance(Host h, Target t);
GetInstance();
void Execute();
private:
Command(Host h, Target t);
}
我需要确保在 CreateInstance
之后调用 GetInstance
。还有其他选择吗?
目标类(class)是低级别类(class),事件很少。
Target::LowlevelEvent()
{
cmd->Execute(lowlevelevent) //In Execute for lowlevelevent in Command class, i might call target->reset
}
抱歉没能解释清楚。问题是,这段代码有很多事件(方法),这些事件(方法)可能位于 EventManager 或 Target 等类中。
在每个事件中,我都必须调用 Command->Execute()。命令类需要主机和目标实例,因为它们可以执行某些操作。
EventManager::Event1() { cmd->执行(_event1); }
目标::Event2() { cmd->执行(_event2); }
命令::执行(事件e)
{
如果 (_event1 == e )
{
主机->CallAction();
}
if (_event2 == e)
{
目标->CallSomeOtherAction();
}
}
所以现在 cmd 需要是 EventManager 和 Target 的实例变量,对吧?现在 EventManager 具有可以传递给 Command ctor 的主机和目标实例。
但 Target 无权访问主机。所以我无法在 Target 类中创建 Command 实例。
所以我想知道是否在 EventManager 构造函数中创建单例。然后在Target中调用GetInstance()。我知道这是个坏主意,但对于这个巨大的设计,我无法弄清楚。感谢您的帮助。
最佳答案
我真的不明白你的问题,但是,仅从标题来看,我可以这样说:不要使用单例。它需要参数这一事实是单例模式的一个很好的反指标。
如果您想确保所有命令都使用相同的参数创建,您可以向客户端提供 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;
};
那么你也可以实现某种 object pool重用对象。
关于c++ - Singleton 类,其构造函数需要参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4461535/