使用用户定义的函数编译类中的错误

我正在尝试构建一个在其中存储用户定义函数以供以后使用的类。我决定使用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;
 }

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

最亲切的问候!

cuihe 回答:使用用户定义的函数编译类中的错误

DefaultFunctionSomeClass的成员函数。 为SomeClass的某些实例调用成员函数。 此函数将指向SomeClass实例的“隐藏”指针作为对int的第一个参数添加。 因此成员函数与自由函数不同。

您的someFunctionboost::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,_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
本文链接:https://www.f2er.com/3133443.html

大家都在问