Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Тестовые примеры / ch2 / abstract
.C // source module: abstract.C
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef void (*PF)();
class abstract_base { // abstract base class
protected:
PF fn_ptr;
char *info_msg ; // for displaying information
public:
abstract_base(PF fn=0, char* msg=0) {fn_ptr=fn, info_msg=msg; };
virtual void info(int) =0;
virtual void opr() =0;
};
class menu_obj : public abstract_base { // derived class
public:
menu_obj(PF fn, char *msg) : abstract_base(fn,msg) {};
void info(int menu_idx) {
cout << menu_idx << ": " << info_msg << "\n";
};
void opr() { this->fn_ptr(); };
};
inline void fn0() {
long tim = time(0);
cerr<<"Local: "<<asctime(localtime(&tim))<<"\n";
}
inline void fn1() {
long tim = time(0);
cerr<<"GMT: "<<asctime(gmtime(&tim))<<"\n";
}
inline void fn2() { exit(0); }
// dispatch table
menu_obj menu[] = {
menu_obj(fn0, "Local data:time"),
menu_obj(fn1, "GMT date:time"),
menu_obj(fn2, "Exit program")
};
#define MENU_SIZ sizeof(menu)/sizeof(menu[0])
inline void display_menu() {
for (int i=0; i<MENU_SIZ; i++) menu[i].info(i);
}
int main() {
for (int idx; 1; ) {
display_menu();
cout << "Select (0-" << (MENU_SIZ-1) << ")> ";
cin>>idx;
if (idx >=0 && idx<MENU_SIZ)
menu[idx].opr();
else cerr << "Illegal input: " << idx << "\n";
}
return 0;
}