2010-12-16 75 views
2

我有類Command這是一類EventManager的一個實例。類命令在其構造函數中需要兩個參數(host,target)。Singleton類,其構造函數需要參數

class EventManager 
{ 
public: 
    void Event1(){ cmd->Execute(_eventEnum); } 
private: 
    Command *cmd; 
}; 

class Command 
{ 
public: 
    Command(Host h, Target t) 
    void Execute(); 
private: 

} 

現在,如果我需要在目標類的成員函數使用這種方法cmd->Execute(),我需要cmd目標的實例變量或使其全球作爲一個單身。

我不能讓cmd目標的實例變量,因爲它沒有考慮主機實例。爲了讓單身是添加這樣

class Command 
{ 
public: 

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

} 

我需要確保GetInstanceCreateInstance後調用兩種方法。任何其他的選擇?

目標類是一個低級別的類,只有很少的事件。

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

Iam對不起,不能解釋清楚。問題是,這段代碼有很多事件(方法),可能是像EventManager或Target這樣的類。

在每個這些事件,我將不得不調用一個命令 - >執行()。該命令類需要主機和目標實例,因爲它們可以執行某些操作。 EventManager(Event) cmd-> Execute(_event1); }

Target :: Event2() { cmd-> Execute(_event2); }

命令::執行(活動E) { 如果(_event1 == E) { 宿主> CallAction(); } 如果(_event2 == E) { 靶> CallSomeOtherAction(); }
}

所以現在cmd需要是EventManager和Target的實例變量嗎?現在EventManager具有可以傳遞給Command ctor的主機和目標實例。

但Target無權訪問主機。所以我不能在Target類中創建Command實例。

所以,如果我創建eventmanager進行男星單身我想知道。然後在Target中調用GetInstance()。我知道它的不好主意,但有了這個巨大的設計,iam無法弄清楚。謝謝你的幫助。

+1

'Command'不是'EventManager'的實例,也什麼'Target'樣子?你應該修復你的代碼示例... – Nim 2010-12-16 14:04:40

+0

我認爲這是更多的設計問題。將命令作爲單例表示你只能有一個命令。另外,Target不應該告訴命令自己執行。 – 2010-12-16 14:16:30

+0

你應該儘量[避免單身設計](http://www.techradar.com/news/software/applications/10-mistakes-every-programmer-makes-909424)。 – Default 2010-12-16 14:18:07

回答

5

我真的不明白你的問題,但是,只是從標題,我可以這樣說:不要使用單身人士。它需要參數是單身模式的一個很好的反指標。

如果要確保使用相同參數創建所有命令,可以爲客戶端提供一個CommandFactory,該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重用的對象。

0

其實完全沒有必要作出Command單身。只需要用適當的參數實例化一個,然後將其傳遞給管理器,然後使用它並擺脫它。您可能想要通過它,因此使用shared_ptr是個好主意。根據你的代碼

相關問題