#include <iostream>

#include <conio.h>

#include <string>

#include <vector>

using namespace std;

 

#define clrscr()       system("cls")

 

class AbstractMenu

{

        string title;

public:

        AbstractMenu( string s ) : title(s) { }

 

        virtual string GetTitle() const { return title; }

 

        virtual void Command() = 0;   // 순수가상함수- 자식은 꼭 만들어야 한다.

};

 

class MenuItem : public AbstractMenu

{

        int id;

public:

        // 부모의 디폴트 생성자가 없으므로 여기서 초기화 해준다.

        MenuItem( string s, int n ) : AbstractMenu(s), id(n) { }    

 

        // 메뉴 선택시 처리

        virtual void Command()

        {

               cout << "MenuItem::Command" << endl;

               getch();

        }

};

 

class PopupMenu : public AbstractMenu

{

        vector<AbstractMenu*> menu_list;      // Composite

public:

        PopupMenu(string s) : AbstractMenu(s) { }

 

        void Add( AbstractMenu* p ) { menu_list.push_back( p ); }

        void Remove() { }      // 나중에 구현.

 

        virtual string GetTitle() const

        {

               return string("[") + AbstractMenu::GetTitle() + string("]");

        }

 

        // 팝업 메뉴가 선택 되었을 때를 처리한다.

        virtual void Command()

        {

               while(1)

               {

                       // 화면을 지우고 자신의 하위메뉴를 열거해준다.

                       clrscr();

 

                       for( int i = 0; i < menu_list.size(); ++i )

                       {

                              cout << i + 1 << "." <<
                                           menu_list[i]->GetTitle() << endl;

                       }

 

                       cout << menu_list.size() + 1 << ". 이전메뉴로" << endl;

                       //-------------------------------------------

                       int cmd;

                       cout << "메뉴를 생성하세요>> ";

                       cin >> cmd;

 

                       if ( cmd == menu_list.size()+1 ) // 이전 메뉴로 선택

                              break; // return; 루프 탈출해서 이함수를 마치고

                                     // 자신을 호출한 부분으로 돌아간다.

 

                       // 잘못 선택한 경우
                      
if ( cmd <= 0 || cmd > menu_list.size() )

                              continue;

 

                       // 해당 메뉴를 실행한다.

                       menu_list[cmd-1]->Command();

               }

        }

};

 

int main()

{

        PopupMenu* p1 = new PopupMenu("ROOT");

 

        PopupMenu* p2 = new PopupMenu("고객관리");

        PopupMenu* p3 = new PopupMenu("Tape관리");

        PopupMenu* p4 = new PopupMenu("기타");

 

        p1->Add( p2 );

        p1->Add( p3 );

        p1->Add( p4 );

 

        p2->Add( new MenuItem("신규고객등록", 1) );

        p2->Add( new MenuItem("고객삭제", 2) );

        p2->Add( new MenuItem("기타", 2) );

 

        p3->Add( new MenuItem("신규Tape등록", 1) );

        p3->Add( new MenuItem("Tape삭제", 2) );

        p3->Add( new MenuItem("기타", 2) );

 

        p1->Command();

}

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다