2017-01-09 54 views
-2

这里是我的代码:纪念品设计模式

class Number; 

class Memento 
{ 
    public: 
    Memento(int val) 
    { 
     _state = val; 
    } 
    private: 
    friend class Number; // not essential, but p287 suggests this 
    int _state; 
}; 

class Number 
{ 
    public: 
    Number(int value) 
    { 
     _value = value; 
    } 
    void dubble() 
    { 
     _value = 2 * _value; 
    } 
    void half() 
    { 
     _value = _value/2; 
    } 
    int getValue() 
    { 
     return _value; 
    } 
    Memento *createMemento() 
    { 
     return new Memento(_value); 
    } 
    void reinstateMemento(Memento *mem) 
    { 
     _value = mem->_state; 
    } 
    private: 
    int _value; 
}; 

class Command 
{ 
    public: 
    typedef void(Number:: *Action)(); 
    Command(Number *receiver, Action action) 
    { 
     _receiver = receiver; 
     _action = action; 
    } 
    virtual void execute() 
    { 
     _mementoList[_numCommands] = _receiver->createMemento(); 
     _commandList[_numCommands] = this; 
     if (_numCommands > _highWater) 
      _highWater = _numCommands; 
     _numCommands++; 
     (_receiver-> *_action)(); 
    } 
    static void undo() 
    { 
     if (_numCommands == 0) 
     { 
      cout << "*** Attempt to run off the end!! ***" << endl; 
      return ; 
     } 
     _commandList[_numCommands - 1]->_receiver->reinstateMemento 
      (_mementoList[_numCommands - 1]); 
     _numCommands--; 
    } 
    void static redo() 
    { 
     if (_numCommands > _highWater) 
     { 
      cout << "*** Attempt to run off the end!! ***" << endl; 
      return ; 
     } 
     (_commandList[_numCommands]->_receiver->*(_commandList[_numCommands] 
      ->_action))(); 
     _numCommands++; 
    } 
    protected: 
    Number *_receiver; 
    Action _action; 
    static Command *_commandList[20]; 
    static Memento *_mementoList[20]; 
    static int _numCommands; 
    static int _highWater; 
}; 

Command *Command::_commandList[]; 
Memento *Command::_mementoList[]; 
int Command::_numCommands = 0; 
int Command::_highWater = 0; 

int main() 
{ 
    int i; 
    cout << "Integer: "; 
    cin >> i; 
    Number *object = new Number(i); 

    Command *commands[3]; 
    commands[1] = new Command(object, &Number::dubble); 
    commands[2] = new Command(object, &Number::half); 

    cout << "Exit[0], Double[1], Half[2], Undo[3], Redo[4]: "; 
    cin >> i; 

    while (i) 
    { 
    if (i == 3) 
     Command::undo(); 
    else if (i == 4) 
     Command::redo(); 
    else 
     commands[i]->execute(); 
    cout << " " << object->getValue() << endl; 
    cout << "Exit[0], Double[1], Half[2], Undo[3], Redo[4]: "; 
    cin >> i; 
    } 
} 

什么是在上面的程序语句typedef void(Number:: *Action)()的意义是什么?它是函数指针,那么函数定义在哪里?

+1

友好和善意的提示:把你的设计模式书籍,把他们藏在地下室。就在那只愤怒的狗的笼子后面,它会咬人试图去找他们的人。然后把它们忘掉,直到狗死了。同时,学习C++的基础知识;) – BitTickler

+0

感谢您的建议@BitTickler将根据您的建议开始基础知识:) –

回答

2

什么是语句的意义:在上面的程序“typedef void(Number::*Action)()” ?????它是函数指针,那么函数定义在哪里?

这是一个aliaspointer to a member-function。属于这样命名Number类和成员函数成员函数有什么作为参数,并返回一个void

这使得它可以使用名称Action作为类型说明符声明一个变量,如前文所述,其类型。

ISO C++'s FAQ about Pointers to Members