1.


1.
虚函数是指只在当前类下定义,但不在当前类下实现
虚函数的定义格式为 virtual 返回类型格式 函数名() = 0
是就是ConcreteCommand类为当前类的子类,所以函数实现放在了ConcreteCommand类,找了一圈发现是void Execute(),于virtual void Execute() = 0
void Execute()上面 ConcreteCommand(Receiver* receiver) : receiver(receiver){} 为构造函数,可以理解成对通过类创建出来的对象进行初始化;如果不带参数,由程序员给对象中的成员变量赋初值;如果带参数,那么在new 对象的时候,就可以由用户来给成员变量赋初值;: 后的叫做初始化列表,即用传来的参数receiver来初始化成员变量receiver
2.
根据类图可以看到,Execute函数是用作receiver->action() 的
3.
创建对象前,要先分清楚对象的栈分配与堆分配
栈分配:Invoker invoker(参数)
堆分配:Invoker* invoker = new Invoker(参数)
具体的区别如下,有点像变量与指针的关系
因为只对由 ConcreteCommand 创建出的对象 command 进行delete了,所以 command为堆分配,invoker为栈分配
即 ConcreteCommand* command = new ConcreteCommand(&receiver)Invoker invoker(command)
因为给到 command 对象中的成员变量类型为接收者指针,所以还得要对 receiver 取地址
最后使用时,invoker.executeCommand()
2.


1.
public Subject,理由同上题中的1
2.
observers是一个指针数组,it是一个迭代器指针,所以使用时应该是先对迭代器指针解引用,即 *it 然后再对指针进行使用,Observer 类当中只有一个函数,那么猜测大概率就是要运用该函数了;当然,也行通过类图发现:EnvironmentData类为Subject的子类,即类图中的ConcreteSubject,得update;所以是(*it) -> update(temperature,humidity,cleanness)
3.上面注释提到:当主题发声改变时通知观察者,于是measurementsChanged()以后,得要notifyObservers()
4.主题变了以后,要采用主题更改函数来告知主题变了,所以是measurementsChanged()
5.
与该题的第2问同理,CurrentConditionsDisplay指的是类图中的ConcreteObserver,有register interest,即 registerObserver 函数,该函数在subject类当中,所以要调用envData 成员变量,即envData -> registerObserver(this)
this指针指的是调用这个函数的那个对象,这边可以看作是由 CurrentConditionsDisplay 类创建出来的 currentDisplay
3.



1.根据前面的函数返回类型,要求返回一个 Memento 类型的数据,Memento类中有定义构造函数,所以直接返回这个构造函数对象,即Memento(state)回去即可
2.getStateFromMemento暗示了 state =Memento.getState()
3. and 4.
main函数中分别有调用,get函数与add函数,index明显是个整型变量,所以4为get(int index),3为add(Memento state)
5.直接抄下面的,originator->saveStateToMemento()
