2017-04-02 87 views
0

我知道這已被多次詢問,大部分答案都很難理解。 你能幫我弄清楚我做錯了什麼嗎?C++指針使用std :: function成員函數

#include <iostream> 
#include <algorithm> 
#include <vector> 
#include <iterator> 
#include <functional> 

class A{ 
    public: 
     A(double i){ 
      _b = i; 
     } 
     double square(double i){ 

      return i*i*_b; 
     } 


    private: 
    double _i; 
    double _b; 
}; 

double cube(double (*objfunc)(double), double x){ 
    return objfunc(x)*x; 
} 

int main() 
{ 
    double v = 2.0; 
    A a(v); 

    using std::placeholders::_1; 
    std::function<double(double)> f_square = std::bind(&A::square, &a, _1); 
    double x = cube(f_square,3.0); 
    std::cout << " x = " << x << std::endl; 


} 

非常感謝您的建議。

鑑於類A和立方函數,因爲它們是如何在主函數中使用立方函數?

更新:只有這樣,才能做到這一點是修改:

double cube(std::function<double(double)> objfunc, double x){ 
    return objfunc(x)*x; 
} 
+0

您正在嘗試傳遞'std :: function'實例,其中需要一個普通函數指針。前者不能轉換爲後者。 –

+0

你能幫我修改主要功能嗎?什麼是使用函數正方形的正確方法? – user1453817

+0

我覺得不能做成員函數指針不是簡單的指針。但我的理解非常有限。因此,讓我們等待專家進來。 – user1453817

回答

2

cube採取std::function對象,而不是一個函數指針。同時擺脫std::bind並使用lambda和auto的魔法。

#include <iostream> 
#include <functional> 

class A 
{ 
public: 
    A(double i) : _b(i) {} 
    double square(double i) { return i*i*_b; } 
private: 
    double _b; 
}; 

double cube(std::function<double(double)> objfunc, double x) 
{ 
    return objfunc(x)*x; 
} 

int main() 
{ 
    double v = 2.0; 
    A a(v); 

    auto f_square = [&a] (double x) { return a.square(x); }; 
    double x = cube(f_square,3.0); 
    std::cout << " x = " << x << std::endl; 
}