数组类的创建——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指针解决函数形参和 ...
随机推荐
- 《java面试十八式》--引子
爪哇城中 “喂,你等等我啊”少女气喘吁吁的喊道 “大小姐,你可快点吧,报名马上就要结束了.” 这是爪哇城一年一度的大选比赛,被选上的人会留下来任职,享有名誉和金钱,所以大家都在积极准备. ...
- Python3 常用模块3
目录 numpy模块 创建numpy数组 numpy数组的属性和用法 matplotlib模块 条形图 直方图 折线图 散点图 + 直线图 pandas模块 numpy模块 numpy模块可以用来做数 ...
- 【JS】302- 回调地狱解决方案之Promise
为什么出现Promise 在javascript开发过程中,代码是单线程执行的,同步操作,彼此之间不会等待,这可以说是它的优势,但是也有它的弊端,如一些网络操作,浏览器事件,文件等操作等,都必须异步执 ...
- JavaEE基础(05):过滤器、监听器、拦截器,应用详解
本文源码:GitHub·点这里 || GitEE·点这里 一.Listener监听器 1.概念简介 JavaWeb三大组件:Servlet,Listener,Filter.监听器就是指在应用程序中监听 ...
- 建议2:注意Javascript数据类型的特殊性---(4)避免误用parseInt
parseInt是一个将字符串转换为整数得函数,与parseFloat(将字符串转换为浮点数)对应,这两种函数是JavaScript提供得两种静态函数,用于把非数字得原始值转换为数字. 在开始转换时, ...
- 防止DataGridview闪烁
在Load事件中加入 typeof(DataGridView).InvokeMember("DoubleBuffered", BindingFlags.NonPublic | Bi ...
- 《Java练习题》习题集五
编程合集: https://www.cnblogs.com/jssj/p/12002760.html Java总结:https://www.cnblogs.com/jssj/p/11146205.ht ...
- 在.NET Core控制台中使用依赖注入
本文介绍如何在控制台应用程序中使用微软提供的依赖注入功能,掌握控制台中的用法后,可以扩展到构建windows服务中. 创建控制台应用程序 添加DependencyInjection的引用 Instal ...
- PyTorch-网络的创建,预训练模型的加载
本文是PyTorch使用过程中的的一些总结,有以下内容: 构建网络模型的方法 网络层的遍历 各层参数的遍历 模型的保存与加载 从预训练模型为网络参数赋值 主要涉及到以下函数的使用 add_module ...
- 简单实用的git命令
1.下载项目 先进入目录然后使用jit $ git clone +"url" 2.项目配置 $ composer install 3.上传项目 $ git add . () $ g ...