1

これはステートマシンのデザインパターンの例です..私はそれにいくつかの問題に直面しています。説明して解決策を示してください。

これはコードです:

#include <iostream>
using namespace std;
class Machine
{
  class State *current;
  public:
    Machine();
    void setCurrent(State *s)
    {
        current = s;
    }
    void on();
    void off();
};

class State
{
  public:
    virtual void on(Machine *m)
    {
        cout << "   already ON\n";
    }
    virtual void off(Machine *m)
    {
        cout << "   already OFF\n";
    }
};

void Machine::on()
{
  current->on(this);
}

void Machine::off()
{
  current->off(this);
}

class ON: public State
{
  public:
    ON()
    {
        cout << "   ON-ctor ";
    };
    ~ON()
    {
        cout << "   dtor-ON\n";
    };
    void off(Machine *m);
};

class OFF: public State
{
  public:
    OFF()
    {
        cout << "   OFF-ctor ";
    };
    ~OFF()
    {
        cout << "   dtor-OFF\n";
    };
    void on(Machine *m)
    {
        cout << "   going from OFF to ON";
        m->setCurrent(new ON());
        delete this;
    }
};

void ON::off(Machine *m)
{
  cout << "   going from ON to OFF";
  m->setCurrent(new OFF());
  delete this;
}

Machine::Machine()
{
  current = new OFF();
  cout << '\n';
}

int main()
{
  void(Machine:: *ptrs[])() = 
  {
    Machine::off, Machine::on
  };
  Machine fsm;
  int num;
  while (1)
  {
    cout << "Enter 0/1: ";
    cin >> num;
    (fsm. *ptrs[num])();
  }
}

これはエラーです:

prog.cpp:関数内'int main()':
prog.cpp:89:エラー:非静的メンバー関数の無効な使用' void Machine :: off()'<br> prog.cpp:89:エラー:無効非静的メンバー関数の使用'voidMachine :: on()' <br> prog.cpp:97:エラー:予期されたunqualified-idbefore'*'トークン

4

1 に答える 1

6

2つのエラーがあります:

1つは、メンバーへのポインターを作成するために、address-of演算子が必須です。したがって、配列の初期化は次のようになります。

void(Machine:: *ptrs[])() = 
{
  &Machine::off, &Machine::on
};

2つ目は、メンバーへのポインターを逆参照する演算子は.*です。これは単一のトークンであるため、空白は許可されません。

(fsm.*ptrs[num])();
于 2012-11-28T08:45:04.923 に答える