#ifndef SOBJECT_H
#define SOBJECT_H
#include <vector>
#include <iostream>
#include <algorithm>
class SObject
{
public:
SObject(SObject * parent = nullptr);
~SObject();
private:
SObject * m_parent;
std::vector<SObject *> m_children;
};
#endif // SOBJECT_H
#include "sobject.h"
SObject::SObject(SObject * parent)
:m_parent(parent)
{
if(m_parent)
m_parent->m_children.push_back(this);
printf("SObject init\n");
}
SObject::~SObject()
{
//for(auto &child :m_children)
//{
// delete child;
// child = nullptr;
//}
//这里选择用下面的循环,来避免c++11基于范围for循环带来的坑
for(int i = 0; i < m_children.size(); i++)
{
SObject * child = m_children[i];
delete child;
child = nullptr;
i--; //没有这句会core,因为m_children.size在不断减小。
}
m_children.clear();
if(m_parent)
{
auto it = std::find(m_parent->m_children.begin(),m_parent->m_children.end(),this);
if(it != m_parent->m_children.end())
{
m_parent->m_children.erase(it);
}
}
printf("~SObject \n");
}
//#include <QCoreApplication>
#include "sobject.h"
int main(int argc, char *argv[])
{
//QCoreApplication a(argc, argv);
SObject p;
SObject *obj1 = new SObject(&p);
SObject *obj2 = new SObject(&p);
SObject *obj3 = new SObject(&p);
SObject *obj4 = new SObject(&p);
SObject *obj5 = new SObject(&p);
SObject *obj6 = new SObject(&p);
//return a.exec();
}