完成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的更多相关文章

  1. 数组类的创建——StaticArray.h

    创建好的基于顺序存储结构的线性表存在两个方面的问题:1)功能上的问题:数组操作符的重载带来的问题,有可能线性表被无用为数组了,线性表被当做数组来使用了.2)效率方面的问题 本篇博客就要解决功能上的问题 ...

  2. 网易云课堂_C++程序设计入门(下)_第10单元:月映千江未减明 – 模板_第10单元 - 单元作业:OJ编程 - 创建数组类模板

    第10单元 - 单元作业:OJ编程 - 创建数组类模板 查看帮助 返回   温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提 ...

  3. C++——模板、数组类

    1.函数模板:可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计. 声明方法:template<typename 标识符> 函数声明 求绝对值的模板 #in ...

  4. C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?

    原文  http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++  C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...

  5. 李洪强iOS开发之OC[013] -类的创建的练习

    // //  main.m //  12 - 类的创建练习 // //  Created by vic fan on 16/7/9. //  Copyright © 2016年 李洪强. All ri ...

  6. 2--OC -- 类的创建与实例化

    2.OC -- 类的创建与实例化   一.OC类的简述 1.OC类分为2个文件:.h文件用于类的声明,.m文件用于实现.h的函数: 2.类是声明使用关键字:@interface.@end : 3.类是 ...

  7. iOS 开发学习-类的创建与实现,与java语言的对比

    Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { //在{}中定义属性(全局变量/实例变量 ...

  8. C++学习之动态数组类的封装

    动态数组(Dynamic Array)是指动态分配的.可以根据需求动态增长占用内存的数组.为了实现一个动态数组类的封装,我们需要考虑几个问题:new/delete的使用.内存分配策略.类的四大函数(构 ...

  9. c++-变量,this指针,全局函数,成员函数,自定义数组类

    区分变量属于哪个对象 c++对象管理模型初探 C++类对象中的成员变量和成员函数是分开存储的,C中内存四区仍然有效 C++编译器对普通成员函数的内部处理(隐藏this指针) this指针解决函数形参和 ...

随机推荐

  1. jquery (内置遍历数组的函数,事件)

    内置遍历数组的函数: 1. $.map(array, function() { }); 取到数组或者对象array中每一项进行遍历  然后在function中处理: var attr = [1,2,3 ...

  2. Python3 面向对象进阶1

    目录 组合 概念 目的 实现方式 封装 概念 目的 实现方式 访问限制 概念 目的 实现方式 property 概念 目的 实现方式 多态 概念 目的 抽象类 概念 目的 实现方法 鸭子类型 组合 概 ...

  3. Dapr 运用之 Java gRPC 调用篇

    JAVA GRPC 服务与调用 安装协议编译器 下载对应的版本编译器,并把路径加入到环境变量中,执行以下命令生成代码 protoc -I=$SRC_DIR --java_out=$DST_DIR $S ...

  4. idea 几个常用的设置

    一.主题的背景

  5. Leetcode题解 - 贪心算法部分简单题目代码+思路(860、944、1005、1029、1046、1217、1221)

    leetcode真的是一个学习阅读理解的好地方 860. 柠檬水找零 """ 因为用户支付的只会有5.10.20 对于10元的用户必须找一个5 对于20元的用户可以找(三 ...

  6. 红帽杯-MISC-Advertising for Marriage

    convert -flip screenshot.png screensho1.png 本篇结合我上一博客https://www.cnblogs.com/qq3285862072/p/11869403 ...

  7. [译]C# 7系列,Part 6: Read-only structs 只读结构

    原文:https://blogs.msdn.microsoft.com/mazhou/2017/11/21/c-7-series-part-6-read-only-structs/ 背景 在.NET世 ...

  8. 前后端分离及Element的使用

    1. 前后端分离 1.1 什么是前后端分离 在传统的web应用开发中,大多数的程序员会将浏览器作为前后端的分界线.将浏览器中为用户进行页面展示的部分称之为前端,而将运行在服务器,为前端提供业务逻辑和数 ...

  9. angular8 导出excel文件

    angular package 1.xlsx npm install xlsx --save 2.file-saver npm install file-saver --save npm instal ...

  10. confluence 挖矿木马应急响应

    最近遇到一台confluence wiki主机被挖矿,收到CPU 告警异常之后,登录查看,进行分析. top c 命令查看,果然CPU 已经资源已经被吃完了.. 看到用户是confluence,100 ...