Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
17
Добавлен:
01.05.2014
Размер:
1.77 Кб
Скачать
		// 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;
 		}
Соседние файлы в папке ch2