数据结构C++语言实现系列文章的代码实现在智能指针、异常类、顶层父类三大基础类上进行代码实现,本文介绍顶层父类。
.为什么要创建顶层父类?当代软件架构实践中尽量使用单重继承的方式进行设计,尽量保持系统中只存在单一的继承树,尽量使用组合关系代替继承关系。
但是,C++语言的灵活性使得代码中可以存在多个继承树,C++编译器的差异使得同样的代码可能表现不同的行为。
问:new操作如果失败会发生什么?
答:上古时代的编译器new失败返回空指针,而当今编译器new失败会抛出异常,所以我们要使得DataStructLib可复用就得重载new和delete(在顶层父类中完成new和delete的重载)。
2.顶层父类的创建创建DataStructLib::Object类后,所有数据结构都继承自Object类,遵循经典设计准则。定义动态内存申请的行为,提高代码的移植性。
#ifndefOBJECT_H#defineOBJECT_HnamespaceDataStructLib{classObject{public:void*operatornew(longlongunsignedintsize)throw();voidoperatordelete(void*p);void*operatornew[](longlongunsignedintsize)throw();voidoperatordelete[](void*p);booloperator==(constObjectobj);booloperator!=(constObjectobj);virtual~Object()=0;};}#endif//OBJECT_H
#include"Object.h"#includecstdlib#defineOBJECT_DEBUG#ifdefOBJECT_DEBUG#includeiostreamusingnamespacestd;#endifnamespaceDataStructLib{void*Object::operatornew(longlongunsignedintsize)throw(){#ifdefOBJECT_DEBUGcout"Object::operatornew"sizeendl;#endifreturnmalloc(size);}voidObject::operatordelete(void*p){#ifdefOBJECT_DEBUGcout"Object::operatordelete"pendl;#endiffree(p);}void*Object::operatornew[](longlongunsignedintsize)throw(){returnmalloc(size);}voidObject::operatordelete[](void*p){free(p);}boolObject::operator==(constObjectobj){return(this==obj);}boolObject::operator!=(constObjectobj){return(this!=obj);}Object::~Object(){}}
#includeiostream#include"Exception.h"usingnamespacestd;usingnamespaceDataStructLib;classTest:publicObject{public:inti;intj;};classChild:publicTest{public:intk;};intmain(){Object*obj=newTest();Object*obj2=newChild();cout"obj"objendl;cout"obj2"obj2endl;//...deleteobj;deleteobj2;return0;}
我们的数据结构库里面的类都继承自这个顶层父类的话就能保证从堆空间里创建数据结构对象必然使用的就是我们定义的new和delete的实现了。
3.小结Object类是DataStructLib中数据结构类的顶层父类,Object类用于统一动态内存申请的行为,在堆中创建Object子类的对象,失败时返回NULL值,Object类为纯虚父类,所有子类都能进行动态类型识别。
Exception类继承自Object类,堆空间中创建异常对象失败时,返回NULL指针。SmartPointer类继承自Object类,堆空间中创建智能指针对象失败时,返回NULL指针。
到此,我们三大基础设施智能指针、异常类、顶层父类创建完成,后续数据结构的开发都将在此基础进行。
Note:数据结构实践系列文章中用到了非常多的C++和C语言知识,数据结构系列文章中不再重复讲解,具体可以参考本