0

我想将类A的成员函数作为参数传递给全局函数。我该做些什么才能做到这一点?另外,这是一个好主意吗?上下文:我想这样做是因为(同义词)doSomething(...)是一个非常通用的函数,用于main()以及不同的类。因此,我可以避免在项目中有相同代码的多个副本。什么是替代品(如果它不是最佳的)?将类成员函数作为参数传递给全局函数

#include <iostream> 
using namespace std; 

double doSomething(int i, double (*f)(double)) { return (*f)(i); } 

class A{ 
public: 
    A(double x) : number(x) {} 
    double times(double i) { return ::doSomething(i, &A::multiply);} //calles the global function and gives a member function as parameter 
    double multiply(double i) {return number*i;} 
private: 
    double number; 
}; 

int main() { 

    A obj(5.0); 
    cout << obj.times(3.5) <<endl; 

    return 0; 
} 

编译器抱怨:

../src/test5.cpp: In member function ‘double A::times(double)’: 
../src/test5.cpp:17:63: error: cannot convert ‘double (A::*)(double)’ to ‘double (*)(double)’ for argument ‘2’ to ‘double doSomething(int, double (*)(double))’ 
    double times(double i) { return ::doSomething(i, &A::multiply);} //calles the global function and gives a parameter member function as parameter 
                  ^
../src/test5.cpp:17:65: warning: control reaches end of non-void function [-Wreturn-type] 
    double times(double i) { return ::doSomething(i, &A::multiply);} //calles the global function and gives a parameter member function as parameter 

回答

1

doSomething函数需要自由函数指针(免费功能是指非成员函数)。您尝试将成员函数指针传递给它。这不起作用。为什么?当你有一个免费的功能,说void f(double),你可以简单地把它叫做:

f(3.14); 

在另一方面,当你有一个成员(非静态)函数,调用它,你需要一个对象,如:

obj.m(3.14); 

并且无法在没有对象的情况下调用成员函数。所以成员函数不能与自由函数互换使用,因为它们以不同的方式被调用。想想doSomething函数中的(*f)(i)调用 - multiply要调用的对象A是什么?

您的设计需要重新思考。如果你想分享代码,也许你需要一些类层次结构和基类中的通用代码?

1

用C++ 11你可以这样做:

#include <functional> 

typedef std::function<double (double)> do_something_function; 
double doSomething(double i, do_something_function f) { return f(i); } 

class A{ 
    public: 
    A(double x) : number(x) {} 
    double times(double i) { 
     do_something_function f = [this] (double i) { 
      return this->multiply(i); 
     }; 
     return ::doSomething(i, f); 
    } 
    double multiply(double i) { 
     return number * i; 
    } 

    private: 
    double number; 
}; 
0

调用通过指针类的non-static功能部件,从方法上有所不同的方式你做对独立的功能,因为指针实例需要

#include <iostream> 
using namespace std; 

class A; 
typedef double (A::*f)(double); 
double doSomething(double i, f p, A* ap); 

class A { 
public: 

    A(double x) : number(x) { 
    } 

    double times(double i) { 
     return ::doSomething(i, &A::multiply, this); 
    } //calles the global function and gives a member function and pointer to A 

    double multiply(double i) { 
     return number*i; 
    } 
private: 
    double number; 
}; 

double doSomething(double i, double (A::*fp)(double), A* ap) { 
    return (ap->*fp)(i); // call *fp on *ap 
} 

int main() { 

    A obj(5.0); 
    cout << obj.times(3.5) << endl; 

    return 0; 
} 

example

+0

在你的榜样,我会仍然需要declair对象的类型'doSomething'希望。这意味着我仍然需要其他对象的相同代码的副本。我认为Wojtek Surowka重新考虑我的设计是正确的。谢谢您的回答。 – dani

相关问题