#include <iostream>
#include <string>
#include <sstream>
#include <map>
using namespace std;
class Device {
public:
Device(void): item_number(0) {}
virtual void doAddItem(string parameter) {
istringstream iss(parameter);
int num = 0;
iss >> num;
item_number += num;
}
virtual void doDelItem(string parameter) {
istringstream iss(parameter);
int num = 0;
iss >> num;
item_number -= num;
}
virtual void doShowItem(string parameter) {
cout << item_number << endl;
}
virtual void execute(string command, string parameter) = 0;
protected:
int item_number;
};
class AngelDevice;
class DemonDevice;
template <typename T>
class Commander {
public:
void addInvocation(string command, void (T::*fptr)(string)) {
cmdMap[command] = fptr;
}
void (T::*getInvocation(string command))(string) {
return cmdMap[command];
}
protected:
map < string, void (T:: *)(string) > cmdMap;
};
class AngelDevice : public Device {
typedef void (AngelDevice::*APTR)(string);
public:
AngelDevice(void) {
commander.addInvocation("add", &AngelDevice::doAddItem);
commander.addInvocation("del", &AngelDevice::doDelItem);
commander.addInvocation("twice", &AngelDevice::doTwiceItem);
commander.addInvocation("show", &AngelDevice::doShowItem);
}
virtual ~AngelDevice() {}
virtual void doAddItem(string parameter) {
istringstream iss(parameter);
int num = 0;
iss >> num;
item_number += num * 2;
}
virtual void doDelItem(string parameter) {
istringstream iss(parameter);
int num = 0;
iss >> num;
item_number -= num / 2;
}
virtual void doTwiceItem(string parameter) {
item_number *= 2;
}
virtual void execute(string command, string parameter) {
APTR ptr = commander.getInvocation(command);
if(ptr) {
(this->*ptr)(parameter);
}
}
protected:
Commander<AngelDevice> commander;
};
class DemonDevice : public Device {
typedef void (DemonDevice::*DPTR)(string);
public:
DemonDevice() {
commander.addInvocation("add", &DemonDevice::doAddItem);
commander.addInvocation("del", &DemonDevice::doDelItem);
commander.addInvocation("half", &DemonDevice::doHalfItem);
commander.addInvocation("show", &DemonDevice::doShowItem);
}
virtual ~DemonDevice() {}
virtual void doAddItem(string parameter) {
istringstream iss(parameter);
int num = 0;
iss >> num;
item_number += num / 2;
}
virtual void doDelItem(string parameter) {
istringstream iss(parameter);
int num = 0;
iss >> num;
item_number -= num * 2;
}
virtual void doHalfItem(string parameter) {
item_number /= 2;
}
virtual void execute(string command, string parameter) {
DPTR ptr = commander.getInvocation(command);
if(ptr) {
(this->*ptr)(parameter);
}
}
protected:
Commander<DemonDevice> commander;
};
int main(int argc, char *argv[]) {
string command, parameter;
AngelDevice device;
for(; true;) {
cin >> command >> parameter;
device.execute(command, parameter);
}
system("pause");
return EXIT_SUCCESS;
}
2010年8月7日 星期六
天使與魔鬼物件
標籤:
C++
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言