c++ - Singleton 类,其构造函数需要参数

标签 c++ singleton

我有类Command,它是类EventManager的实例。类 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);

}

我需要确保在 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/

相关文章:

C++:为什么这段代码给我内存问题/未定义的行为?

java - 如何以正确的方式编写单例?

java - 线程安全、静态方法和一些奇怪的代码

使用 Lazy<T> 的 C# 单例模式

actionscript-3 - 在 Actionscript 3 中实现单例模式类的最佳方法是什么?

javascript - 从任何地方访问 Singleton

c++ - 在可执行文件中禁用优化并将它们维护在静态库中

c++ - 创建具有最小深度的二叉搜索树

c++ - 从T创建std::future <T>的最佳方法

c++ - 调用 undefined reference 的函数