通过 BaseClass List 调用派生类对象的析构函数
Call Destructor of derived ClassObjects via BaseClass List
我让这个类来获取所有派生对象的列表
Register.h
-----------------
class Register {
...
public:
// static object list
static list<Register*> instances;
// default constructor for register object
Register::Register();
// virtual destructor to clean up with subobject destructor first
virtual Register::~Register();
// default methods for this class
static void Register::stop();
Register.cpp
-----------------
#include "Register.h"
// list with all object instances made by this programm
list<Register*> Register::instances;
// default destructor
Register::~Register() {
list<Register*>::iterator p = find(instances.begin(), instances.end(), this);
if (p != instances.end()) {
instances.erase(p);
}
}
// erase all instances clean up the dish
void Register::stop() {
// last log message
Log::write("register cleanup");
// stops the logging object
Log::stop();
// clean up instances
list<Register*>::iterator iter = instances.begin();
list<Register*>::iterator end = instances.end();
while (iter != end) {
cout<< endl << (*iter) -> typeName << endl;
//delete *iter;
}
Register::instances.clear();
}
和派生类
File.h
-----------------
class File : public Register {
...
// default destructor
virtual File::~File(void);
...
}
File.cpp
-----------------
// default destructor
File::~File(void) {
cout << "file destr";
this -> deleteFile();
}
Log.h
-----------------
// this class implements a log handler
// (derived from register)
class Log : public File {
public:
// singelton logging object
static Log* log;
// default destructor
Log::~Log(void);
Log.cpp
-----------------
using namespace std;
// declare pointer for easy logging
Log* Log::log = NULL;
// default destructor
Log::~Log(void) {
cout << "log destr";
}
现在我想删除整个结构,只需删除列表和其中的对象。
我试过
Main.cpp
-----------------
int main (int argc, char *argv[], char *envp[]) {
Register::stop();
return 1;
}
但对象仍被实例化
我没有想法^^
请。。
Register::instances.clear();
这将清除指针列表,但不对对象执行任何操作。在清除列表之前,您需要自己删除它们,例如像这样
for (list<Register *>::iterator it = Register::instances.begin();
it != Register::instances.end();
++it) {
delete *it;
}
Register::instances.clear();
作为手动清除列表的替代方法,C++11引入了与STL容器兼容的std::unique_ptr<>智能指针。
static std::list<std::unique_ptr<Register>> instances;
基本上会负责删除对象。
好的..我解决了它..
// clean up instances
list<Register*>::iterator iter = instances.begin();
list<Register*>::iterator end = instances.end();
while (iter != end) {
iter = instances.erase(iter);
}
Register::instances.clear();
相关文章:
- 什么时候调用组成单元对象的析构函数
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- C++析构函数调用两次,堆栈分配的复合对象
- 如何从 Gtk::窗口调用派生对象的析构函数
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 为什么为未删除的对象调用析构函数?
- 对象的构造函数和析构函数
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- C++使用函数对象的线程,如何调用多个析构函数而不是构造函数?
- 从未调用shared_ptr对象的析构函数
- 是否可以在其析构函数中使用指向已销毁对象的指针?
- 使用私有析构函数删除动态分配的对象
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 对象析构函数在多线程处理时不断被调用,但该对象并未超出范围
- C++包含包含指针的对象的对象析构函数
- Objective-C++C++对象析构函数
- 结构对象析构函数
- 在Exit()时调用基本对象析构函数