2010-09-20 59 views
0

我想將數據和功能描述發送到遠程站點。在遠程站點接收到數據後,我想查看描述並創建一個對象(通過工廠方法),當我在其上調用exec時,完成我想要的操作。在運行時選擇一個類的味道來實現一個函數?

實例:

1)發送[3,(添加5)] =>接收(OBJ); obj-> exec() - > 8

2)send [3,(add-1,mult 2)] => receive(obj); obj-> exec() - > 4

我想過在某種形式的多重繼承中使用加法器和多層類,但無法弄清楚任何事情,因爲這涉及到從不同的功能排列中創建許多類。我想我需要學習一些東西:)模板?我主要關心的是exec()函數中的零條件還可以輕鬆添加新功能。

感謝

+0

exec()中有零條件的原因是什麼? – Simon 2010-09-20 17:09:30

+0

因爲我會使用這種方法很多,代碼必須很快。我的意思是我無法每次執行時都測試所有可能的組合。 – perreal 2010-09-20 17:14:25

+0

雖然 – perreal 2010-09-20 17:16:15

回答

0

你說你不想建立能力的不同排列單獨的班,我同意。但是,你能否將你的「能力」分解爲一組原子操作和另一組合器。如果他們都來自一個共同的「執行者」的對象導出,用一個虛擬的「高管」的方法,這可能做的伎倆:

class executor { 
    public: 
    virtual double exec(); 
}; 

class constant_exec : public executor { 
    public: 
    constant_exec(double value) : m_value(value) {} 
    double exec() {return m_value;} 
    private: 
    double m_value; 
}; 

class add_op : public executor { 
    public: 
    add_op(executor const *lhs, executor const* rhs) : m_lhs(lhs), m_rhs(rhs){} 
    double exec() {return rhs->exec + lhs->exec;} 
    private: 
    executor const* m_rhs, m_lhs; 
}; 
    ... and so on 

這樣你就可以建立任意複雜的操作。您確實需要擔心正確處理執行程序對象,因此您可能希望考慮使用共享(也可能是弱)指針,儘管這會對性能產生一些輕微影響。

-matt

+0

感謝您的時間。這到底是一個解析樹嗎?我看不出如何以這種方式組合不同的操作。 – perreal 2010-09-20 19:25:14

+0

那麼,它至少是一個評估樹。在上面的第二個例子中,構造的對象看起來像:new mul_op(new const_exec(2), new add_op(new const_exec(-1), new const_exec(3)))。如果你的消息只是乘法/加法鏈,那應該很容易構造。 – Gretchen 2010-09-20 20:25:55

相關問題