2017-02-06 187 views
0

也許我是用這個問題離開左邊的領域,但是有可能通過構造函數定義成員函數嗎?通過構造函數初始化成員函數

在我的情況下,我想寫一個類來執行健壯的模型擬合(使用RANSAC)。我希望這可以推廣到不同類型的模型。例如,我可以用它來確定飛機對一組3D點的估計。或者,也許我可以確定兩組點之間的轉換。在這兩個例子中,可能需要有不同的錯誤函數和不同的擬合函數。而不是使用類,靜態函數調用可能看起來像

model = estimate(data, &fittingFunc, &errorFunc); 

我想知道如果我可以有這些模塊化功能的成員實例?

喜歡的東西

class Estimator 
{ 
    private: 
     // estimation params 

     double errorFunc(std::vector<dtype>, double threshold); // Leave this unimplemented 
     double fittingFunc(std::vector<dtype>, Parameters p); // Leave this unimplemented 

    public: 
     Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double)); 

     dtype estimate(data); // Estimates model of type dtype. Gets implemented 

}; 

Estimator::Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double)) 
{ 
    fittingFunc = fittingFunc; 
    errorFunc = errorFunc; 
} 

我想我已經在我的例子bastardized正確的語法,但我希望這個問題是清楚的。基本上我問:構造函數是否可以接受函數指針作爲參數並將它們賦值爲成員函數的實現?

其次,即使這是可能的,它被認爲是不好的形式嗎?

更新:如果有幫助,here is MATLAB code for robust estimation有這種一般化結構的我希望能複製在C++

+0

的回答你的問題是**是**。並在'double'中更正你的代碼;'和這個分號是爲了什麼? –

+0

@ k-five:錯字,對不起。是的,這可能嗎?或者是的,這是不好的形式?或兩者? – marcman

+0

儘管[*** Pimpl idiom ***](http://stackoverflow.com/questions/60570/why-should-the-pimpl-idiom-be-used)可能是更好的方法。 –

回答

4

的構造函數可以接受函數指針作爲參數,並將其分配是成員函數的實現?

編號不作爲成員功能。但是,你當然可以有公共成員函數指針

class Estimator 
{ 
public: 
    double (*errorFunc)(std::vector<dtype>, double threshold); 
    double (*fittingFunc)(std::vector<dtype>, Parameters p); 

public: 
    Estimator(void (*fittingFunc(std::vector<dtype>, Parameters), void (*errorFunc(std::vector<dtype>, double)) 
    : errorFunc(errorFunc) 
    , fittingFunc(fittingFunc) 
    { } 

    dtype estimate(data);  
}; 

對於更好(或更安全)接口,可以使函數指針private,並具有簡單地調用這些公共成員函數。


更一般地,如果您能夠接受的開銷,你可以有std::function<double(std::vector<dtype>, double)>類型和std::function<double(std::vector<dtype>, Parameters)>的成員,那麼你可以使用更廣泛的可調用的(函數指針,也是lambda表達式,綁定的成員函數,等等)

+0

這似乎是我想到的,尤其是在私人指針方面。我會嘗試一下,如果有效,請接受 – marcman

+0

謝謝。我正在努力尋找它允許的標準(http://ideone.com/r4rr2j)以及爲什麼我無法得到它的工作,這要歸功於評論中強調的Yeses。 – user4581301

+0

@ M.M我建議。 – Barry

1

是的,你可以提供你的擬合和錯誤函數的算法。你可以使用指向函數的方法做到這一點。並且有一個更好的解決方案,在標準頭文件中,您將找到模板std :: function,它可以用函數指針構造,也可以用函數或lambda表達式構造。

你的類將是這樣的:

#include <functional> 
class Estimator 
{ 
private: 
    // estimation params 
    using error_func_type = std::function<double(std::vector<dtype>,double)>; 
    using fitting_func_type = std::function<double(std::vector<dtype>,Parameters p)>; 
    fitting_func_type fittingFunc; 
    error_func_type errorFunc; 


public: 
    Estimator(fitting_funct_type fit, error_funct_type err) 
     :fittingFunc(fit),errorFunc(err){} 

    dtype estimate(data); // Estimates model of type dtype. Gets implemented 

}; 
相關問題