单例类,其ctor需要参数

时间:2010-12-16 14:01:46

标签: c++ singleton

我有一个类Command,它是类EventManager的一个实例。 Class Command在其构造函数中需要两个参数(hosttarget)。

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);

}

我需要确保在GetInstance之后调用CreateInstance。还有其他选择吗?

目标类是一个低级别的类,几乎没有事件。

Target::LowlevelEvent()
{
 cmd->Execute(lowlevelevent) //In Execute for lowlevelevent in Command class, i might call target->reset
}
我很抱歉无法解释清楚。问题是,这段代码有很多事件(方法),可能在像EventManager或Target这样的类中。

在每个事件中,我都必须调用Command-> Execute()。命令类需要主机和目标实例,因为它们可以执行某些操作。

eventmanager进行::事件1() {  CMD->执行(_event1); }

目标::事件2() {  CMD->执行(_event2); }

Command :: Execute(事件e) {  if(_event1 == e)  {    宿主 - > CallAction();  }  if(_event2 == e)  {    靶> CallSomeOtherAction();  }
}

那么现在cmd需要是EventManager和Target的实例变量吗?现在EventManager有主机和目标实例,可以传递给Command ctor。

但Target无法访问主机。所以我无法在Target类中创建Command实例。

所以我想知道我是否在EventManager ctor中创建了单例。然后在Target中调用GetInstance()。我知道它的坏主意,但有了这个巨大的设计,我无法弄明白。谢谢你的帮助。

2 个答案:

答案 0 :(得分:5)

我真的不明白你的问题,但是,从标题来看,我可以说:不要使用单身。它需要参数的事实是单例模式的一个非常好的反指标。

如果要确保使用相同参数创建所有命令,可以为客户端提供创建命令实例的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来重用对象。

答案 1 :(得分:0)

绝对没有必要让Command成为单身人士。只需使用适当的参数实例化一个,将其传递给管理器,使用它并摆脱它。您可能想要传递它,因此最好使用shared_ptr