如何在运行时更改方法的行为?

Tai*_*and 5 c++ function-pointers

精简版:

要点是实例的(复杂)状态可以被类定义之外的函数改变,因此类可以扩展为具有各种内部状态,而不会用许多状态污染类定义 -二传手。

假设以下代码:

 class bar
 {
      virtual void ChangeState()=0;
 }
 class foo:bar
 {
 private:
      int b;
 public:
      void ChangeState() {b=3;}
 }
Run Code Online (Sandbox Code Playgroud)

我想做的是创建不同的函数,然后在运行时将它们传递给函数,例如

foo.ChangeState(); //b is 3 now
void foo::(?)ChangeState2(){ b=2; };
foo.ChangeState=ChangeState2;
foo.ChangeState(); //b is 2 now
Run Code Online (Sandbox Code Playgroud)

可以在 C++ 中实现这样的构造,而不使用 hacks 吗?

lap*_*apk 3

也许,这会有所帮助:

#include <iostream>

namespace so
{

class B
{
  friend void change_1( B * );
  friend void change_2( B * );
  friend void change_3( B * );

  int i;
 public:
  B() : i{ 0 } {}

  void change_state( void (*_function)( B * ) )
  {
   _function( this );

   std::cout << i << std::endl;
  }
};

void change_1( B * _object )
{
 _object->i = -1;
}
void change_2( B * _object )
{
 _object->i = -2;
}
void change_3( B * _object )
{
 _object->i = -3;
}

} //namespace so

int main()
{
 so::B b{ };

 b.change_state( so::change_1 );
 b.change_state( so::change_2 );
 b.change_state( so::change_3 );

 return( 0 );
}
Run Code Online (Sandbox Code Playgroud)

  • 这[与我想出的类似](http://coliru.stacked-crooked.com/view?id=2374eff4521ef575b7c21854a02662a0-c96156d6cc95286981b0e9deef2eefae) (2认同)