1.将QT文件调用顺序熟悉- -遍
2.将QT项目中,每个文件的每行代码,自行注释- -遍
3.重新手动实现对象树模型
#include <iostream> //输入输出库
#include<list> //向量的删除插入,链表的插入删除库
using namespace std; //释放std的命名空间
class Object //类名是objict的父类
{
public: //权限公有
list<Object *> child; //子组件链表,带指针的链表child
public: //权限公有
Object(Object *parent = nullptr) //构造函数 形参是父组件的指针,而且是空指针
{
if(parent != nullptr) //父组件存在
{
//说明创建对象时,给定了父组件,说明要将自己的地址放到父组件的孩子链表中
parent->child.push_back(this); //child链表的尾插,插上parent地址,是objict指定的当前对象的地址
}
}
virtual ~Object() //将所有的子组件释放//析构函数 释放构造函数里链表的指针的空间
{
for(auto p = child.begin(); p!=child.end(); p++) //一个指针p ,指向child链表的头和尾
{
delete *p; //释放指针
}
}
};
//派生类
class A : public Object //类的继承 A继承了父类object成为了子类
{
public:
A(Object *parent = nullptr) // 父类的指针父指针为空
{
if(parent != nullptr)
{
parent->child.push_back(this); //父指针在链表里的地址是类的当前地址
}
cout<<"A::构造函数"<<endl; //A有了构造函数
}
virtual ~A()
{
cout<<"A::析构函数"<<endl; //释放指针
}
};
class B : public Object //再继承一个类对象B
{
public:
B(Object *parent = nullptr)
{
if(parent != nullptr)
{
parent->child.push_back(this);
}
cout<<"B::构造函数"<<endl;
}
virtual ~B()
{
cout<<"B::析构函数"<<endl;
}
};
int main()
{
A w; //在栈区申请空间,相当于自己的MyWnd //局部变量是栈区系统生成与释放生命周期短
B *btn = new B(&w); //delete btn; //申请的自定义空间来自堆区,所以要手动释放
// delete btn; //注释了就是&w,A中的类对象,引用了A 不注释就是也是A中的类对象不过可以先释放
system("color 17");
return 0;
}