1. 程式人生 > 實用技巧 >使用C++的類模擬目錄樹

使用C++的類模擬目錄樹

由於QVector沒有自定義刪除器的功能,直接呼叫解構函式會導致記憶體洩漏
故使用指標方式,遞迴刪除節點
我們的類還禁止在棧中定義變數,並且將解構函式設定為私有,禁止使用new的操作
所以申請物件使用entity::New,使用obj.Delete遞迴釋放子節點記憶體

`#include

include

include

include

using namespace std;

struct entity {
static entity* New() { return new entity(); }
//遞迴刪除所有的子節點
void Delete() { _delete(this); }
QVector<entity> nextes; //使用指標的方式顯示析構容器內元素
int id;
friend ostream& operator<< (ostream& os, struct entity& n);
private:
void _delete(entity

next);
void _free() { std::cout << "this is" << this << std::endl; delete this; }
entity() :nextes(new QVector<entity
>) {}
~entity() {};
};
//
////解構函式,負責釋放子節點
//entity::~entity() {
//
//}

//釋放子節點
void entity::_delete(entity* n) {
//遞迴釋放
if (n->nextes && n->nextes->size()) {
for (entity* i : *n->nextes) {
_delete(i);
}
}
n->_free();
}

ostream& operator<<(ostream& os,struct entity& n){

//遞迴呼叫
std::cout << n.id << std::endl;
if (n.nextes && n.nextes->size()) {
	for (entity* i : *n.nextes) {
		operator<<(os, *i);
	}		
}
return os;

}

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

{
	entity *e = entity::New() ;
	e->id = 1;

	entity *e1 = entity::New();
	e1->id = 2;

	e->nextes->append(e1);

	entity *e2 = entity::New();
	e2->id = 3;
	e1->nextes->append(e2);
	//迴圈引用錯誤
	//e2->nextes->append(e);

	std::cout << *e;


	e1->Delete();
	e = nullptr;
	
}

return a.exec();

}

`