头文件 GraphManage.h
/******************************************** CopyRight 200 北京交通大学 程序名称: 图形管理容器 文件名: GraphManage.h 修改日期: 2007-4-7 19:31:01 描述: 定义了容器类及相关图形类 ********************************************/ #include <iostream> #include <vector> using namespace std; //基态类 Container class Container { public: Container(int ID, int Type); int virtual GetArea() = 0; int virtual GetGirth() = 0; virtual ~Container(){}; void ShowInfo(); int GetId() { return m_nID; } protected: int m_nID; int m_nType; }; //直线类 Line class Line : public Container { public: Line(int ID); int GetArea(); int GetGirth(); protected: int m_nLength; }; //三角类 Triangle class Triangle : public Container { public: Triangle(int ID); int GetArea(); int GetGirth(); protected: int m_a, m_b, m_c; }; //椭圆类型 Ellipse class Ellipse : public Container { public: Ellipse(int ID); int GetGirth(); int GetArea(); protected: int m_a, m_b; }; //矩阵类 Matrix class Matrix : public Container { public: Matrix(int ID); int GetArea(); int GetGirth(); protected: int m_a, m_b; }; //容器管理类 Manager class Manager { private: vector<Container *> m_vecGraph; int m_num; public: Manager() : m_num(0){}; void AddGraph(int type); void DelGraph(int ID); void Clear(); void ShowAll(); int Get_Num() { return m_num; }; };
实现文件 GraphManage.cpp
/******************************************** CopyRight 2007 北京交通大学 程序名称: 图形管理容器 文件名: GraphManage.cpp 修改日期: 2007-4-7 20:13:48 描述: 菜单实现及容器测试主程序 ********************************************/ #include <iostream> #include "GraphManage.h" #include <list> #include <cmath> using namespace std; void Container::ShowInfo() { cout << "编号:" << m_nID << endl << "类型:"; switch (m_nType) { case 1: cout << "直线"; break; case 2: cout << "三角形"; break; case 3: cout << "矩形"; break; case 4: cout << "椭圆"; break; } cout << endl; cout << "面积:" << this->GetArea() << endl << "周长:" << this->GetGirth() << endl << endl; } Container::Container(int ID, int Type) { this->m_nID = ID; this->m_nType = Type; } int Line::GetArea() { return 0; } int Line::GetGirth() { return this->m_nLength; } Line::Line(int ID) : Container(ID, 1) { int Length = 0; do { cout << "请输入直线长度:"; cin >> Length; } while (Length <= 0); this->m_nLength = Length; } Triangle::Triangle(int ID) : m_a(0), m_b(0), m_c(0), Container(ID, 2) { cout << "请依次输入三边长度:"; cin >> m_a >> m_b >> m_c; } Triangle::GetArea() { double s = static_cast<double>((m_a + m_b + m_c) / 2); return sqrt(s * (s - m_a) * (s - m_b) * (s - m_c)); } Triangle::GetGirth() { return m_a + m_b + m_c; } Matrix::Matrix(int ID) : m_a(0), m_b(0), Container(ID, 3) { do { cout << "请输入两个边长:"; cin >> m_a >> m_b; } while (m_a < 0 || m_b < 0); } int Matrix::GetArea() { return m_a * m_b; } int Matrix::GetGirth() { return (m_a + m_b) * 2; } Ellipse::Ellipse(int ID) : m_a(0), m_b(0), Container(ID, 4) { do { cout << "请输入椭圆的长半轴与短半轴长度:"; cin >> m_a >> m_b; } while (m_a < 0 || m_b < 0 || m_a < m_b); } int Ellipse::GetArea() { return 3.14 * m_a * m_b; } int Ellipse::GetGirth() { return 2 * 3.14 * m_b + 4 * (m_a - m_b); } void Manager::AddGraph(int type) { Container *ptr = NULL; switch (type) { case 1: ptr = new Line(++this->m_num); break; case 2: ptr = new Triangle(++this->m_num); break; case 3: ptr = new Matrix(++this->m_num); break; case 4: ptr = new Ellipse(++this->m_num); break; } if (ptr) { this->m_vecGraph.push_back(ptr); cout << "成功写入容器!" << endl; } else cout << "内存分配失败!" << endl; } void Manager::ShowAll() { cout << endl << "--------------" << endl << "开始遍历容器:" << endl << endl; vector<Container *>::iterator itCur = m_vecGraph.begin(); while (itCur != m_vecGraph.end()) { (*itCur)->ShowInfo(); itCur++; } cout << "遍历结束!\n--------------" << endl; } void Manager::DelGraph(int ID) { vector<Container *>::iterator itCur = m_vecGraph.begin(); bool flag = false; while (itCur != this->m_vecGraph.end()) { if ((*itCur)->GetId() == ID) { flag = true; cout << "成功从容器中清空" << (*itCur)->GetId() << "号图形" << endl; delete (*itCur); itCur = m_vecGraph.erase(itCur); } else itCur++; } } void Manager::Clear() { vector<Container *>::iterator itCur = m_vecGraph.begin(); while (itCur != this->m_vecGraph.end()) { if (*itCur) delete (*itCur); itCur++; } this->m_vecGraph.clear(); cout << "清空完毕!"; }
测试程序main.cpp
/******************************************** CopyRight 2007 北京交通大学 程序名称: 图形管理容器 文件名: main.cpp 修改日期: 2007-4-7 19:29:32 描述: 测试容器类Manager及菜单实现 ********************************************/ #include <iostream> #include "GraphManage.h" using namespace std; class Menu { public: void Choice(); Menu() : m_Choice(-1){}; ~Menu() { cout << "感谢使用本容器!!"; }; private: void Show(); int m_Choice; Manager m_Manage; }; void Menu::Choice() { while (m_Choice) { Show(); cin >> m_Choice; switch (m_Choice) { case 1: { int type = 0; cout << "请选择添加类型:"; cout << "1.直线 2.三角形 3.矩形 4.椭圆形" << endl; do { cin >> type; } while (type < 1 || type > 4); m_Manage.AddGraph(type); } break; case 2: { int id = 0; do { cout << "请输入1~" << this->m_Manage.Get_Num() << "之间的一个ID(0推出):"; cin >> id; if (id == 0) break; } while (id > this->m_Manage.Get_Num() || id < 1); if (id) this->m_Manage.DelGraph(id); else break; } break; case 3: this->m_Manage.Clear(); break; case 4: { this->m_Manage.ShowAll(); } break; case 5: m_Choice = 0; } } } void Menu::Show() { cout << "**容器测试程序***" << endl; cout << "1.为容器添加对象" << endl; cout << "2.删除容器中对象" << endl; cout << "3.清空容器" << endl; cout << "4.遍历容器" << endl; cout << "5.退出程序" << endl; }