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?
4

2 に答える 2

1

あなたfunction()は本当の関数です、function Callback代わりにあなたが欲しいです。

サンプルプログラムを参照してください: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オブジェクトに設定することができます

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とプレースホルダーを使用して、パラメーターを関数に渡すこともできます。

于 2013-02-15T11:55:15.540 に答える
0

2つの方法があります:

  • 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;
    
于 2013-02-15T11:41:06.737 に答える