2011-09-18 57 views
0

我有一個調用幾個函數來處理其數據的算法。這些功能中的每一個都共享和操縱許多相同的變量。因此,我試圖避免有一組函數包含一長串引用參數,因爲我發現變得很難閱讀,特別是因爲這些變量中有很多是STL容器。其結果是,我實現了一個函子來進行算法的工作,並定義的仿函數的函數封裝,如下圖所示使用函數調用函數

class myfunctor { 
private: 
    ... list of shared members ... 

    void A(..args..) { ..do some work on shared members.. } 
    void B(..args..) { ..do some work on shared members.. } 
    void C(..args..) { ..do some work on shared members.. } 

public: 
    void operator()(class1& X, class2& Y) { 
     A(..); 
     .. 
     B(..); 
     .. 
     C(..); 
     ..etc.. 
    } 
}; 

void algorithm(class1& X, class2& Y) { 
    myfunctor obj; 
    obj(X, Y); 
} 

我只是好奇,看看是否有可能是一個更好的辦法實現幾個都依賴於相同變量的函數,如果這被認爲是不好的做法?

+0

@anon - 啊,我以前從來沒有注意到這些。感謝您的通知。 – entitledX

+0

爲什麼使這個函子而不是函數?如果參數列表真的很笨拙,爲什麼不用'A(class1&X,class2&Y)','B(class1&X,class2&Y)等等? – Beta

+0

X和Y在你的函數中如何使用。在這個代碼示例中,你很難清楚你想要做什麼 - 你能舉出一個更具體的例子嗎?從你的描述來看,這聽起來像這些函數應該只是成員函數。 –

回答

3

由於使用相同的共享數據的許多函數,使它們作爲實例數據的類的成員函數是理性的選擇。

然而,「仿函數」也許不是你的野獸的正確名詞。

算符行爲很像一個簡單的函數指針:它可以自由拷貝左右,通常,來自呼叫者’的角度來看,沒有按’噸出現改變狀態。雖然你的獸獸顯然不能自由地在周圍複製,並且確實出現了改變狀態。我說你的野獸更像是一個狀態機對象,通過函數調用從狀態到狀態。

乾杯&心連心,