单例类,其ctor需要参数

exc*_*ray 2 c++ singleton

我有一个类Command,它是一个类的实例EventManager.Class 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:

}
Run Code Online (Sandbox Code Playgroud)

现在,如果我需要cmd->Execute()在Tar​​get类的成员函数中使用此方法,我需要创建cmdTarget的实例变量或将其作为单例全局化.

我不能创建cmd一个Target的实例变量,因为它不接受主机实例.要使它成为单身,就可以添加两个这样的方法

class Command
{
public:

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

}
Run Code Online (Sandbox Code Playgroud)

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

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

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

我很抱歉无法解释清楚.问题是,这段代码有很多事件(方法),可能在像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有主机和目标实例,可以传递给Command ctor.

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

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

Bjö*_*lex 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;
};
Run Code Online (Sandbox Code Playgroud)

然后,您还可以实现某种对象池来重用对象.