我正在尝试建立一个在其中存储用户定义函数以供以后使用的类。我决定使用boost::function
对象来这样做。
但是,在编译时出现以下错误:
error: no match for ‘operator=’ in ‘((SomeClass*)this)->SomeClass::someFunction = ((SomeClass*)this)->SomeClass::DefaultFunction’
我不理解此错误,因为据我所知,someFunction和DefaultFunction应该具有相同的类型。
代码如下所示:
#include <boost/function.hpp>
class SomeClass{
private:
boost::function<int(int)> someFunction;
int DefaultFunction(int i);
public:
SomeClass();
~SomeClass();
void SetFunction(int (*f)(int));
};
int SomeClass::DefaultFunction(int i){
return i+1;
}
SomeClass::SomeClass(){
someFunction=DefaultFunction;
}
~SomeClass::SomeClass(){
}
void SomeClass::SetFunction(int (*f)(int i)){
someFunction=f;
}
void MyProgram(){
SomeClass s;
}
任何人都可以提供有关如何构造这样的对象的指针吗?或者,如果有比我尝试的方法更好的方法,您能向我解释一下吗?
最诚挚的问候!
DefaultFunction
是SomeClass
的成员函数。对于SomeClass
的某些实例调用成员函数。此函数将指向SomeClass
实例的“隐藏”指针作为对int
的第一个参数添加。因此成员函数与自由函数不同。
您的someFunction
是boost::function
的对象,因此它是可调用对象的包装。您对该对象的要求是:接受int并返回int。为了将DefaultFunction
(作为成员函数)分配给someFunction
,您需要创建此可调用对象。在这里,您需要指定将为SomeClass
的哪个实例调用此对象,使用boost::bind
可以做到这一点:
SomeClass::SomeClass(){
someFunction=boost::bind(&SomeClass::DefaultFunction, this, boost::placeholders::_1);
}
在上面的代码中,您将创建可调用对象,其行为类似于
struct unnamedClass {
SomeClass* sc;
unnamedClass (SomeClass* sc) : sc(sc) {} // here sc is this of SomeClass
int operator()(int arg)
{
return sc->DefaultFunction(arg);
}
};
因此,当您调用someFunction(10)
时,它将10作为参数并为当前DefaultFunction
实例调用this
。
此
void SomeClass::SetFunction(int (*f)(int i)){
someFunction=f;
}
因为f
是自由函数,所以没有隐藏-指向类实例的指针,所以起作用。
使用@ rafix07的答案,编译了以下代码:
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/bind/placeholders.hpp>
class SomeClass{
private:
public:
SomeClass();
~SomeClass();
boost::function<int(int)> someFunction;
int DefaultFunction(int i);
void SetFunction(int (*f)(int));
};
int SomeClass::DefaultFunction(int i){
return i+1;
}
SomeClass::SomeClass(){
someFunction=boost::bind(&SomeClass::DefaultFunction, this, _1);
}
SomeClass::~SomeClass(){
}
void SomeClass::SetFunction(int (*f)(int i)){
someFunction=f;
}
int MyOwnProgram(int i){
return i+2;
}
void MyProgram(){
SomeClass s;
std::cout<<s.someFunction(2)<<std::endl;
s.SetFunction(MyOwnProgram);
std::cout<<s.someFunction(2)<<std::endl;
}
int main()
{
MyProgram();
}
程序的输出是:
3
4