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

问题描述 投票:0回答:2

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

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

最诚挚的问候!

class boost functor
2个回答
1
投票

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是自由函数,所以没有隐藏-指向类实例的指针,所以起作用。


0
投票

使用@ 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
© www.soinside.com 2019 - 2024. All rights reserved.