关键词:DynamicArray.h
实现
1. 课程目标
完成DynamicArray.h
类的具体实现
2. DynamicArray.h
设计要点
类模板
- 动态确定内部数组空间的大小
- 实现函数返回数组长度
- 拷贝构造和赋值操作
3. DynamicArray.h
类的声明
4. 重复代码逻辑的抽象
-
init
: 对象构造时初始化操作 -
copy
:在堆空间中申请新的内存,并执行拷贝操作 -
update
:将指定的堆空间作为内部存储数组使用
5. DynamicArray.h
的实现
#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H
#include "Array.h"
#include "Exception.h"
namespace DTLib
{
template <typename T>
class DynamicArray : public Array<T>
{
protected:
int m_length;
T* copy(T* array, int len, int newLen) // 复制数组
{
T* ret = new T[newLen];
if( ret != NULL)
{
int size = (len < newLen) ? len : newLen;
for(int i=0; i<size; i++)
{
ret[i] = array[i];
}
}
else
{
THROW_EXCEPTION(NoEnoughMemoryExcetion, "No memory to copy DynamicArray Object...");
}
return ret;
}
void update(T* array, int length) // 更新成员变量m_array和m_length的值
{
if( array != NULL )
{
T* temp = this->m_array;
this->m_array = array;
this->m_length = length;
delete[] temp;
}
else
{
THROW_EXCEPTION(NoEnoughMemoryExcetion, "No memory to update DynamicArray Object...");
}
}
void init(T* array, int length) // 初始化 m_array 和 m_length
{
if( array != NULL )
{
this->m_array = array;
this->m_length = length;
}
else
{
THROW_EXCEPTION(NoEnoughMemoryExcetion, "No memory to init DynamicArray Object...");
}
}
public:
DynamicArray(int length)
{
init(new T[length], length);
}
DynamicArray(const DynamicArray<T>& obj)
{
init(copy(obj.m_array, obj.m_length, obj.m_length), obj.m_length);
}
DynamicArray<T>& operator= (const DynamicArray<T>& obj)
{
if( this != &obj)
{
update(copy(obj.m_array, obj.m_length, obj.m_length), obj.m_length);
}
return *this;
}
int length() const
{
return m_length;
}
void resize(int length)
{
if(length != m_length)
{
update(copy(this->m_array, this->m_length, length), length);
}
}
~DynamicArray()
{
delete[] this->m_array;
}
};
}
#endif // DYNAMICARRAY_H
6. 小结
-
StaticArray
通过封装原生数组的方式实现数组类 -
DynamicArray
动态申请堆空间,使得数组长度动态可变 - 数组对象能够代替原生数组,并且使用上更安全
- 代码优化是项目开发过程中不可或缺的环节
声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4