使用用户定义的函数在 Class 中编译错误
Compile Errors in Class with User Defined Functions
我正在尝试构建一个 class 以在其中存储用户定义的函数供以后使用。我已决定使用 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
的某个实例调用了成员函数。
此函数将 "hidden" 指向 SomeClass
实例的指针作为其添加到 int
的第一个参数。
所以成员函数和自由函数不一样。
您的 someFunction
是 boost::function
的对象,因此它是可调用对象的包装器。
您对该对象的要求是:采用 int 和 returns 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 作为参数并为当前 this
实例调用 DefaultFunction
。
这个
void SomeClass::SetFunction(int (*f)(int i)){
someFunction=f;
}
之所以有效,是因为 f
是自由函数,它没有隐藏 - 指向 class 实例的指针。
利用@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
我正在尝试构建一个 class 以在其中存储用户定义的函数供以后使用。我已决定使用 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
的某个实例调用了成员函数。
此函数将 "hidden" 指向 SomeClass
实例的指针作为其添加到 int
的第一个参数。
所以成员函数和自由函数不一样。
您的 someFunction
是 boost::function
的对象,因此它是可调用对象的包装器。
您对该对象的要求是:采用 int 和 returns 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 作为参数并为当前 this
实例调用 DefaultFunction
。
这个
void SomeClass::SetFunction(int (*f)(int i)){
someFunction=f;
}
之所以有效,是因为 f
是自由函数,它没有隐藏 - 指向 class 实例的指针。
利用@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