数组类的创建——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并发编程系列-(1) 并发编程基础
1.并发编程基础 1.1 基本概念 CPU核心与线程数关系 Java中通过多线程的手段来实现并发,对于单处理器机器上来讲,宏观上的多线程并行执行是通过CPU的调度来实现的,微观上CPU在某个时刻只会运 ...
- LR静态存储/动态存储/指针变量脚本说明
在一次教程学习中,看到该知识点并记录了下来,希望与大家共同探讨学习. 一.静态存储与动态存储 静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束.动态存储变量是在程序执行过 ...
- MySQL 表记录查询小练习
表记录查询小练习 查看岗位是teacher的员工姓名.年龄 查看岗位是teacher且年龄大于26岁的员工姓名.年龄 查看岗位是teacher且薪资在12000-16000范围内的员工姓名.年龄.薪资 ...
- 成为java高手的成长历程想学好java必看
1:J2SE入门阶段(3-6个月) 学习内容:J2SE常用类,JDBC等等 动态绑定,反射机制等 2:J2EE入门阶段(3个月) 学习内容:JSP/Servlet/JavaBean MVC结构的概念 ...
- centos7 启动停止命令
apache启动systemctl start httpd停止systemctl stop httpd重启systemctl restart httpd mysql启动systemctl start ...
- WMB Commands
Check ports: mqsiprofile //Run this first mqsireportproperties MB8BROKER -e AddressSampleProvider -o ...
- ORACLE存储过程详解
1.定义 所谓存储过程(Stored Procedure),就是一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给 ...
- JAVA使用SnakeYAML解析与序列化YAML
1.概述 本文,我们将学习如何使用SnakeYAML库将 YAML文档转换为Java对象,以及JAVA对象如何序列化为YAML文档. 2.项目设置 要在项目中使用SnakeYAML,需要添加Maven ...
- ThinkPhp RBAC实现原理
RBAC是英文Role-Based Access Control的缩写,是基于角色访问进行控制的机制.意思是给每个用户设定一个角色,然后根据这个角色来判断用户的权限. 在此基于ThinkPhp的MVC ...
- 在 ASP.NET Core 中使用 Serilog 进行日志记录
目录 从 NuGet 安装 Serilog 在 Main函数 中配置 Serilog 在项目中使用 Serilog 进行日志输出 从 NuGet 安装 Serilog 核心的包是 Serilog 和 ...