//#include "widget.h" //#include //int main(int argc, char *argv[]) //{ // QApplication a(argc, argv); // Widget w; // w.show(); // return a.exec(); //} /**************************************************** * 示例 1:组合模式核心代码 * (组合模式指的是把类的对象组织成树形结构,这种树形结构也称为对象树) * **************************************************/ //#include //#include //使用容器。 //using namespace std; //class A //{ //public: //顶级父类。 // vector v; //创建一个存储父类类型指针的容器,此步也可使用形如A* m[11]的数组代替,但数组不能自动扩容。 // void add(A* ma) { v.push_back(ma);} //add函数的主要作用是将ma添加到容器v中。 //}; //class B :public A //需要继承自类A //{ //public: // void add(A* ma) { v.push_back(ma); } //}; //class C :public A //需要继承自类A,该类无add函数,也就是说该类的对象不能有子对象。 //{ // public: //}; //int main(){ // A ma, ma1, ma2, ma3; // B mb, mb1, mb2, mb3; // C mc, mc1, mc2, mc3; // //创建对象树。 // ma.add(&mb); ma.add(&mb1); // mb.add(&mb3); mb.add(&mc); mb.add(&mc1); // mb1.add(&mc2); mb1.add(&ma1); mb1.add(&ma2); //} /**************************************************** * 示例 2:打印出组合模式中的各对象的名称 * **************************************************/ #include #include #include using namespace std; class A { public: string name; vector v; A(){} A(string n){name=n;} void add(A* ma) { v.push_back(ma);} string g(){return name;} void f(){ //用于显示当前对象的容器v中存储的内容。 if(!v.empty()) { cout<::size_type i = 0; i!=v.size(); i++) //遍历容器v。 {cout<g()<<",";} //输出容器v中存储的对象的名称, cout<::size_type i = 0; i!=v.size(); i++) v[i]->pt(); } }; class B :public A { public: B(string n){name=n;} }; class C :public A { //需要继承自类A,该类无add函数,也就是说该类的对象不能有子对象。 public: C(string n){name=n;} }; int main() { //创建对象时传递该对象的名称以便存储。 A ma("ma"),ma1("ma1"); B mb("mb"),mb1("mb1"),mb2("mb2"),mb3("mb3"),mb4("mb4"); C mc1("mc1"),mc2("mc2"); ma.add(&mb); //ma.v[0]=&mb; mb.add(&mb1); //mb.v[0]=&mb1; mb.add(&mb2); //mb.v[1]=&mb2; ma.add(&mb1); //ma.v[1]=&mb1; mb1.add(&mb3); //mb1.v[0]=&mb3; mb1.add(&mb4); //mb1.v[1]=&mb4; mb2.add(&mc1); //mb2.v[0]=&mc1; mb2.add(&mc2); //mb2.v[1]=&mc2; mb2.add(&ma1); //mb2.v[2]=&ma1; cout<<"各对象拥有的子对象"< //#include //#include //using namespace std; //class A {public: // vector v; //容器 // string name; //存储对象名 // virtual string g(){return name;} //虚函数,用于获取子对象的名称。 // A() {} // A(string n) {name=n;} // A(A* ma,string n) {name=n; ma->v.push_back(this); } // virtual ~A() { //虚析构函数,原理请参阅相关C++语法 // cout << "~A" << endl; //❶ ,输出的字符用于测试 // if(!v.empty()){//❷ // cout << "XXXXX" << endl; //用于测试 // for (vector::size_type i = 0; i != v.size(); i++) //❸ // { cout << "object = " <g()<< endl; //❹输出的字符用于测试 // delete v[i]; //❺ // //v[i]->~A(); // cout<<"YYYY"<