2013-02-15 2 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

да, но не так –

+0

Что вы пытаетесь достичь или в чем проблема, которую вы пытаетесь решить? – hmjd

+0

@hmjd хорошо Я делаю этот объект кнопки, и я хочу просто сделать его очень простым в использовании. Таким образом, назначение функции тому, что делает кнопка, делает ее очень простой для меня :) – mr5

ответ

1

см пример программы: 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 и placeholders.

+0

, который является самой быстрой и лучшей реализацией? – mr5

+1

вызываемые объекты предполагают быть быстрее, чем функции, компилятор может встроить код. – billz

+0

do you '#include '? – billz

0

Есть два способа:

  • C++ 03 - вы можете использовать функцию указателя:

    class MClass 
    { 
    public: 
    
        void (*function)(); 
    }; 
    void globalFunction() 
    { 
        // ... 
    } 
    
    MClass obj; 
    mclass.function = globalFunction; 
    
  • в с + +11 вы можете использовать функторы:

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

Это не лямбда. – ecatmur

+0

Да, ваш пример C++ 11 называется универсальной полиморфной функциональной оболочкой и неофициально называется функтором (не путать с математическим термином). – thang

+0

В моей библиотеке std нет этой функции std :: function и std :: bind. Я использую профессиональную версию msvs 2010. – mr5

Смежные вопросы