#include <iostream>
#include <list>
using namespace std;
class Object;//前置声明类
//类型重定义,list模板<Object *>指针 ObjectList
typedef list<Object *> ObjectList;
class Object
{
public:
ObjectList children;//记录子组件的指针
Object(Object * parent = nullptr)//构造函数声明,参数是父组件的指针
{
if(parent != nullptr)
{
//说明该组件有父组件,那么,其父组件就有children链表
//我们就要将该组件的地址放入父组件的孩子链表中,以便于析构父组件时,将子组件也进行析构
parent->children.push_back(this);//将子组件放到链表中
}
}
virtual ~Object()//虚析构函数
{
//it是迭代器(?指针)
for(auto it = children.begin();it!=children.end();it++)//循环析构链表中的所有对象
{
delete *it;
}
}
// ObjectList &childrenList()//指针指向了children列表
// {
// return this->children;//主要是为了展示,没啥用,可以没有
// }
};
//定义测试类
class A:public Object//公有继承object
{
public:
A(Object *parent = nullptr)
{
//判断该组件是否设置父组件
if(parent!=nullptr)
{
parent->children.push_back(this);
}
cout<<"A::构造函数"<<endl;
}
~A()
{
cout<<"A::析构函数"<<endl;
}
};
class B:public Object//公有继承object
{
public:
B(Object *parent = nullptr)
{
//判断该组件是否设置父组件
if(parent!=nullptr)
{
parent->children.push_back(this);
}
cout<<"B::构造函数"<<endl;
}
~B()
{
cout<<"B::析构函数"<<endl;
}
};
int main()
{
A aa;//对象aa
B *p = new B(&aa);//aa是B的父组件
cout << "Hello World!" << endl;
return 0;
}