2017-04-02 97 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; 
}