//Menu.h
#include<iostream>
#include <vector>
#include <string>
using namespace std;
class Menu
{
public:
virtual ~Menu();
virtual void Add(Menu*);
virtual void Remove(Menu*);
virtual Menu* GetChild(int);
virtual void Display() = 0;
virtual void DeleteAll();
protected:
Menu();
Menu(std::string);
std::string m_strName;
};
//Menu.cpp
//#include "Menu.h"
Menu::Menu()
{
}
Menu::Menu(std::string strName) : m_strName(strName)
{
}
Menu::~Menu()
{
}
void Menu::Add(Menu* pMenu)
{}
void Menu::Remove(Menu* pMenu)
{}
Menu* Menu::GetChild(int index)
{
return NULL;
}
void Menu::DeleteAll()
{
}
//SubMenu.h
//#include "Menu.h"
class SubMenu : public Menu
{
public:
SubMenu();
SubMenu(std::string);
virtual ~SubMenu();
void Display();
};
//SubMenu.cpp
//#include "stdafx.h"
//#include "SubMenu.h"
//#include <iostream>
SubMenu::SubMenu()
{
}
SubMenu::SubMenu(string strName) : Menu(strName)
{
}
SubMenu::~SubMenu()
{
cout << "~SubMenu: " << m_strName << endl;
}
void SubMenu::Display()
{
cout << m_strName << endl;
}
//CompositMenu.h
//#include "Menu.h"
//#include <vector>
class CompositMenu : public Menu
{
public:
CompositMenu();
CompositMenu(std::string);
virtual ~CompositMenu();
void Add(Menu*);
void Remove(Menu*);
Menu* GetChild(int);
void Display();
void DeleteAll();
private:
std::vector<Menu*> m_vMenu;
};
//CompositMenu.cpp
//#include "stdafx.h"
//#include "CompositMenu.h"
//#include <iostream>
CompositMenu::CompositMenu()
{
}
CompositMenu::CompositMenu(string strName) : Menu(strName)
{
}
CompositMenu::~CompositMenu()
{
cout << "~CompositMenu: " << m_strName << endl;
}
void CompositMenu::Add(Menu* pMenu)
{
m_vMenu.push_back(pMenu);
}
void CompositMenu::Remove(Menu* pMenu)
{
//m_vMenu.erase(&pMenu);
}
Menu* CompositMenu::GetChild(int index)
{
return m_vMenu[index];
}
void CompositMenu::Display()
{
cout << "+" << m_strName << endl;
vector<Menu*>::iterator it = m_vMenu.begin();
for (; it != m_vMenu.end(); ++it)
{
cout << "|-";
(*it)->Display();
}
}
void CompositMenu::DeleteAll()
{
cout << "+" << m_strName << endl;
vector<Menu*>::iterator it = m_vMenu.begin();
cout << "size:" << m_vMenu.size() << endl;
for (; it != m_vMenu.end();)
{
cout << "|-";
(*it)->Display();
Menu* pMenu = *it;
delete pMenu;
it = m_vMenu.erase(it);//it为删除元素的下一个元素的迭代器
}
cout << "size:" << m_vMenu.size() << endl;
}
//#include "stdafx.h"
//#include "Menu.h"
//#include "SubMenu.h"
//#include "CompositMenu.h"
int main(int argc, char* argv[])
{
Menu* pMenu = new CompositMenu("国内新闻");
pMenu->Add(new SubMenu("时事新闻"));
pMenu->Add(new SubMenu("社会新闻"));
pMenu->Display();
pMenu->DeleteAll();
delete pMenu;
cout << "--------------------------------------------------------------" << endl;
pMenu = new CompositMenu("国际新闻");
pMenu->Add(new SubMenu("国际要闻"));
pMenu->Add(new SubMenu("环球视野"));
pMenu->Display();
pMenu->DeleteAll();
delete pMenu;
return 0;
}
#include<iostream>
#include <vector>
#include <string>
using namespace std;
class Menu
{
public:
virtual ~Menu();
virtual void Add(Menu*);
virtual void Remove(Menu*);
virtual Menu* GetChild(int);
virtual void Display() = 0;
virtual void DeleteAll();
protected:
Menu();
Menu(std::string);
std::string m_strName;
};
//Menu.cpp
//#include "Menu.h"
Menu::Menu()
{
}
Menu::Menu(std::string strName) : m_strName(strName)
{
}
Menu::~Menu()
{
}
void Menu::Add(Menu* pMenu)
{}
void Menu::Remove(Menu* pMenu)
{}
Menu* Menu::GetChild(int index)
{
return NULL;
}
void Menu::DeleteAll()
{
}
//SubMenu.h
//#include "Menu.h"
class SubMenu : public Menu
{
public:
SubMenu();
SubMenu(std::string);
virtual ~SubMenu();
void Display();
};
//SubMenu.cpp
//#include "stdafx.h"
//#include "SubMenu.h"
//#include <iostream>
SubMenu::SubMenu()
{
}
SubMenu::SubMenu(string strName) : Menu(strName)
{
}
SubMenu::~SubMenu()
{
cout << "~SubMenu: " << m_strName << endl;
}
void SubMenu::Display()
{
cout << m_strName << endl;
}
//CompositMenu.h
//#include "Menu.h"
//#include <vector>
class CompositMenu : public Menu
{
public:
CompositMenu();
CompositMenu(std::string);
virtual ~CompositMenu();
void Add(Menu*);
void Remove(Menu*);
Menu* GetChild(int);
void Display();
void DeleteAll();
private:
std::vector<Menu*> m_vMenu;
};
//CompositMenu.cpp
//#include "stdafx.h"
//#include "CompositMenu.h"
//#include <iostream>
CompositMenu::CompositMenu()
{
}
CompositMenu::CompositMenu(string strName) : Menu(strName)
{
}
CompositMenu::~CompositMenu()
{
cout << "~CompositMenu: " << m_strName << endl;
}
void CompositMenu::Add(Menu* pMenu)
{
m_vMenu.push_back(pMenu);
}
void CompositMenu::Remove(Menu* pMenu)
{
//m_vMenu.erase(&pMenu);
}
Menu* CompositMenu::GetChild(int index)
{
return m_vMenu[index];
}
void CompositMenu::Display()
{
cout << "+" << m_strName << endl;
vector<Menu*>::iterator it = m_vMenu.begin();
for (; it != m_vMenu.end(); ++it)
{
cout << "|-";
(*it)->Display();
}
}
void CompositMenu::DeleteAll()
{
cout << "+" << m_strName << endl;
vector<Menu*>::iterator it = m_vMenu.begin();
cout << "size:" << m_vMenu.size() << endl;
for (; it != m_vMenu.end();)
{
cout << "|-";
(*it)->Display();
Menu* pMenu = *it;
delete pMenu;
it = m_vMenu.erase(it);//it为删除元素的下一个元素的迭代器
}
cout << "size:" << m_vMenu.size() << endl;
}
//#include "stdafx.h"
//#include "Menu.h"
//#include "SubMenu.h"
//#include "CompositMenu.h"
int main(int argc, char* argv[])
{
Menu* pMenu = new CompositMenu("国内新闻");
pMenu->Add(new SubMenu("时事新闻"));
pMenu->Add(new SubMenu("社会新闻"));
pMenu->Display();
pMenu->DeleteAll();
delete pMenu;
cout << "--------------------------------------------------------------" << endl;
pMenu = new CompositMenu("国际新闻");
pMenu->Add(new SubMenu("国际要闻"));
pMenu->Add(new SubMenu("环球视野"));
pMenu->Display();
pMenu->DeleteAll();
delete pMenu;
return 0;
}
参考网址:http://www.cnblogs.com/jiese/p/3168844.html