使用用户定义的函数在 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;
 }

任何人都可以提供有关如何构造此类对象的任何指示吗?或者,如果有比我正在尝试的更好的方法,你能给我解释一下吗?

谨致问候!

DefaultFunctionSomeClass的成员函数。 SomeClass 的某个实例调用了成员函数。 此函数将 "hidden" 指向 SomeClass 实例的指针作为其添加到 int 的第一个参数。 所以成员函数和自由函数不一样。

您的 someFunctionboost::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