2013-02-15 52 views
2

函数可以被赋值或者改变它的定义,就像派生类重写函数一样。将成员函数赋值为其他函数

但是在这个时候,它超出了课堂的范围。

我的意思是这样的:

//class.h 

class MClass 
{ 
public: 

    void function(); // this is the function I am referring to. 
} 
//class.cpp 

void MClass::function() { } 

//file1.cpp 
MClass mclass; 


void globalFunction() { } 

mclass.function = globalFunction; //is this even possible? 
+0

是的,但不是那样 – 2013-02-15 11:37:12

+0

你想达到什么或者你想解决什么问题? – hmjd 2013-02-15 12:26:07

+0

@hmjd我正在制作这个按钮对象,我想让它变得非常简单。因此,分配一个函数按钮的作用使得它对我来说非常简单:) – mr5 2013-02-15 12:42:45

回答

1

您的function()是一个真正的功能,您需要改为function Callback

看到示例程序:on ideone

#include <functional> 
class MClass 
{ 
public: 
    std::function<void(void)> func_ptr; 

    void setFuncPtr(const std::function<void(void)>& ptr) 
    { 
    func_ptr = ptr; 
    } 

    void callFuncPtr() 
    { 
    func_ptr(); 
    } 
}; 

您可以设置func_ptr任何callabe OBJET

MClass m; 
m.setFuncPtr(globalFunction); // set to standalone function 
m.callFuncPtr(); 

// set lambda to it 
m.setFuncPtr([](){ std::cout << " do something " << std::endl; }); 
m.callFuncPtr(); 

或者绑定到其他对象

struct Test 
{ 
    void print() { std::cout << "Test::print" << std::endl; } 
}; 
Test t; 
m.setFuncPtr(std::bind(&Test::print, t)); 
m.callFuncPtr(); 

你也可以传递参数的功能通过使用std :: bind和占位符。

+0

哪个是最快最好的实现? – mr5 2013-02-15 12:00:36

+1

可调用对象假定比函数更快,编译器可以内联代码。 – billz 2013-02-15 12:01:37

+0

你是不是'#include '? – billz 2013-02-15 12:03:20

0

有两种方式:

  • C++ 03 - 您可以使用函数指针:

    class MClass 
    { 
    public: 
    
        void (*function)(); 
    }; 
    void globalFunction() 
    { 
        // ... 
    } 
    
    MClass obj; 
    mclass.function = globalFunction; 
    
  • 在C + +11你可以使用仿函数:

    class MClass 
    { 
    public: 
    
        std::function<void()> function; 
    }; 
    void globalFunction() 
    { 
        // ... 
    } 
    
    MClass obj; 
    mclass.function = globalFunction; 
    
+6

这不是一个lambda。 – ecatmur 2013-02-15 11:44:45

+0

是啊你的C++ 11例子被称为通用多态函数包装器,并非正式地称为函子(不要与数学术语混淆)。 – thang 2013-02-15 11:51:56

+0

我的std库没有那个std :: function和std :: bind。我正在使用msvs 2010专业版。 – mr5 2013-02-15 12:02:26