数组类的创建——DynamicArray.h
完成DynamicArray类的具体实现

DynamicArray设计要点
——类模板
动态确定内部数组空间的大小
实现函数返回数组长度
拷贝构造和赋值操作
DynamicArray类的声明
template <typename T>
class DynamicArray : public Array<T>
{
protected:
T m_length;
public:
DynamicArray(int length);
//拷贝构造和赋值操作
DynamicArray(const DynamicArray<T>& obj );
DynamicArray<T>& operator= (const DynamicArray<T>& obj); int length() const;
void resize(int length); //动态重置数组的长度 ~DynamicArray();
};
#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H #include "Array.h"
#include "Exception.h" namespace DTLib
{
template <typename T>
class DynamicArray : public Array<T>
{
protected:
T m_length;
public:
DynamicArray(int length)
{
this->m_array = new T[length]; if(this->m_array != NULL)
{
this->m_length = length;
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "No memory to create DynamicArray object...");
}
}
//拷贝构造和赋值操作
DynamicArray(const DynamicArray<T>& obj )
{
this->m_array = new T[obj.m_length]; if(this->m_array != NULL)
{
this->m_length = obj.m_length; for(int i=; i<m_length; i++)
{
this->m_array[i] = obj.m_array[i];
}
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "No memory to create DynamicArray object...");
}
}
DynamicArray<T>& operator= (const DynamicArray<T>& obj)
{
if(this != &obj)
{
T* array = new T[obj.m_length]; if(array != NULL)
{
for(int i=; i<obj.m_length; i++)
{
array[i] = obj.m_array[i];
} T* temp = this->m_array;
this->m_array = array;
this->m_length = obj.m_length; delete[] temp;
} else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "No memory to copy DynamicArray object...");
}
} return *this;
} int length() const
{
return m_length;
}
void resize(int length) //动态重置数组的长度
{
if(m_length != length)
{
T* array = new T[length]; if(array != NULL)
{
int size = (length < m_length) ? length : m_length; for(int i=; i<size; i++)
{
array[i] = this->m_array[i];
} T* temp = this->m_array;
this->m_array = array;
this->m_length = length; delete[] temp;
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "No memory to resize DynamicArray object...");
}
}
} ~DynamicArray()
{
delete[] this->m_array;
}
}; } #endif // DYNAMICARRAY_H
测试:
#include <iostream>
#include "DynamicArray.h" using namespace std;
using namespace DTLib; int main()
{ DynamicArray<int> sl(); for(int i=; i<sl.length(); i++)
{
sl[i] = i * i;
} for(int i=; i<sl.length(); i++)
{
cout << sl[i] << endl;
} cout << endl;
DynamicArray <int> s2();
s2 = sl;
for(int i=; i<s2.length(); i++)
{
cout << s2[i] << endl;
} cout << endl; s2.resize();
for(int i=; i<; i++)
{
cout << s2[i] << endl;
}
return ; }
代码优化:
DynamicArray类中的函数实现存在重复的逻辑,如何进行代码优化?
重复代码逻辑的抽象
——init
对象构造时的初始化操作
——copy
在堆空间中申请新的内存,并执行拷贝操作
——update
将指定的堆空间作为内部存储数组使用
#ifndef DYNAMICARRAY_H
#define DYNAMICARRAY_H #include "Array.h"
#include "Exception.h" namespace DTLib
{
template <typename T>
class DynamicArray : public Array<T>
{
protected:
T 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=; i<size; i++)
{
ret[i] = array[i];
}
} return ret;
} void update(T* array, int length)
{
if(array != NULL)
{
T* temp = this->m_array; this->m_array = array;
this->m_length = length; delete[] temp;
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "No memory to resize DynamicArray object...");
}
} void init(T* array, int length)
{
if(array != NULL)
{
this->m_array = array;
this->m_length = length;
}
else
{
THROW_EXCEPTION(IndexOutOfBoundsException, "No memory to create 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(m_length != length)
{
update(copy(this->m_array, m_length ,length),length);
}
} ~DynamicArray()
{
delete[] this->m_array;
}
}; } #endif // DYNAMICARRAY_H

数组类的创建——DynamicArray.h的更多相关文章
- 数组类的创建——StaticArray.h
创建好的基于顺序存储结构的线性表存在两个方面的问题:1)功能上的问题:数组操作符的重载带来的问题,有可能线性表被无用为数组了,线性表被当做数组来使用了.2)效率方面的问题 本篇博客就要解决功能上的问题 ...
- 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板
第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...
- C++——模板、数组类
1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #in ...
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
原文 http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...
- 李洪强iOS开发之OC[013] -类的创建的练习
// // main.m // 12 - 类的创建练习 // // Created by vic fan on 16/7/9. // Copyright © 2016年 李洪强. All ri ...
- 2--OC -- 类的创建与实例化
2.OC -- 类的创建与实例化 一.OC类的简述 1.OC类分为2个文件:.h文件用于类的声明,.m文件用于实现.h的函数: 2.类是声明使用关键字:@interface.@end : 3.类是 ...
- iOS 开发学习-类的创建与实现,与java语言的对比
Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { //在{}中定义属性(全局变量/实例变量 ...
- C++学习之动态数组类的封装
动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...
- c++-变量,this指针,全局函数,成员函数,自定义数组类
区分变量属于哪个对象 c++对象管理模型初探 C++类对象中的成员变量和成员函数是分开存储的,C中内存四区仍然有效 C++编译器对普通成员函数的内部处理(隐藏this指针) this指针解决函数形参和 ...
随机推荐
- linux需要了解的网络基础知识
第1章 网络命令 1.1 用户模式下的命令 1.1.1 enable切换到特权模式 Router>enable Router# 特权模式 Router# Router# 1.2 特权模式下的命令 ...
- 适用于带fifo接口的存储器和显示器测试模块封装 挑战cb
cb说完美是没有极限的,对此我表示赞同,自从用了cb的板子,玩开cmos,fpga,sdram,vga等. 不断涌现的是,双端口sdram,四端口sdram,各式各样的封装,但是大同小异,但总是有些不 ...
- Orleans[NET Core 3.1] 学习笔记(二)Hello World
项目结构 开始Orleans之前,我们都知道Orleans主要可以分为俩部分,Host和Client. 所以我们可以创建如下的项目结构: IGrain 一个包含Grain接口的库(.NET Stand ...
- Java_计算1-100的和,奇数和
public class Work1{ public static void main(String[] args){ // 定义和并赋值 int sum = 0; for(int i = 1;i & ...
- SVN重新定位操作流程
因服务器其他系统需要SVN原来使用的443端口无法继续使用需要更换,服务器SVN端口已更新为8443,现将个人电脑SVN文件夹路径重新定位流程展示如下: 确定即修改成功!
- html5 中video标签属性
<video id="haoroomsvideo" src="haorooms.mp4" poster="images/haorooms.j ...
- Microsemi Libero使用技巧——使用命令行模式下载程序
前言 在工程代码编译完成之后,如果需要给某个芯片下载程序时,或者是工厂量产烧录程序时,我们不需要把整个工程文件给别人,而只需要把生成的下载文件给别人,然后使用FlashPro就可以单独下载程序文件了. ...
- sqlserver数据库批量插入-SqlBulkCopy
当想在数据库中插入大量数据时,使用insert 不仅效率低,而且会导致一系列的数据库性能问题 当使用insert语句进行插入数据时.我使用了两种方式: 每次插入数据时,都只插入一条数据库,这个会导致每 ...
- Cesium专栏-地形开挖2-任意多边形开挖(附源码下载)
“任意多边形地形开挖” 是“地形开挖”的补充篇,在这节里,我们介绍关于如何使用任意多边形对地形进行开挖,同时,由于有不少小伙伴也咨询了关于“地形开挖”篇后序内容中的填充地形的效果,之前没放出来,是想让 ...
- 编译安装基于 fastcgi 模式的多虚拟主机的wordpress和discuz的LAMP架构
目录 实现CentOS 7 编译安装基于 fastcgi 模式的多虚拟主机的wordpress和discuz的LAMP架构 准备环境: 准备软件版本: 主机名修改用以区分 数据库服务器 实现数据库二进 ...