快速业务通道

C++技巧之二维动态数组类模板

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

C++提供了许多强大的机制来实现代码的高度复用、来使我们使用我们自已的类就像使用内置类型那样方便快捷。比如模板,运算符重载等等。模板好比如是一个大批量生产函数和类的工厂,使我们不用再去关心与数据类型相关的繁琐编程细节,把我们精力留给那些真正值得我们去认真思考的地方。而运算符重载则使我们的程序更直观更简洁,这不仅使我们更容易读懂我们的程序,而且使我们能以一种更为流畅的方式来表达我们的想法。就像上篇文章说到的,如果我们把动态分配的二维数组用类模板实现,并重载相应的操作符,我们就能十分方便的使用我们自己定义的数组类型了。今天我正好把以往的程序整理了一下,就一并贴了出来,看下面的程序。下面的两个类模板在vc++6.0上编译运行良好,测试程序也都得到正确的结果,如果在其他编译环境下有什么问题,欢迎给我留言。

第一个头文件Array.h是一维动态数组类模板:

//Array.h
#ifndef CARL_SEN_ARRAY_H
#define CARL_SEN_ARRAY_H

#include <iostream>
#include <cstdarg>
using std::out_of_range;
using std::ostream;

template<typename T>
class Array {
protected:
unsigned int size;
T* data;
public:
//构造函数
Array(unsigned int _size=0);
Array(unsigned int count, T data1, ...);

//复制控制
Array(const Array<T>& array);
Array& operator=(const Array<T>& array);
~Array() {
delete[] data;
}
//两种重载运算符
T& operator[](unsigned int index);
const T& operator[](unsigned int index) const;
friend ostream& operator<<(ostream& os, const Array<T>& array);

//get,set成员函数
unsigned int getSize() const {
return size;
}
void setSize(unsigned int newSize);
};

template <typename T>
Array<T>::Array(unsigned int _size):data(new T[_size]), size(_size) {
for(unsigned int i=0; i<size; ++i) {
data[i]=T();
}
}

template <typename T>
Array<T>::Array(unsigned int count, T data1, ...):size(count), data(new T[count]) {
va_list ap;
va_start(ap, count);
for(unsigned int i=0; i<size; ++i) {
data[i]=va_arg(ap, T);
}
va_end(ap);
}

template <typename T>
Array<T>::Array(const Array<T>& array):size(array.size), data(new T[array.size]) {
for(unsigned int i=0; i<size; ++i) {
data[i]=array.data[i];
}
}

template <typename T>
Array<T>& Array<T>::operator=(const Array<T>& array) {
if(&array!=this) {
delete[] data;
data=new T[array.size];
size=array.size;
for(unsigned int i=0; i<size; ++i) {
data[i]=array.data[i];
}
}
return *this;
}

template <typename T>
T& Array<T>::operator[](unsigned int index) {
if(index>=size) {
throw out_of_range("invalid index");
}
return data[index];
}

template <typename T>
const T& Array<T>::operator[](unsigned int index) const {
if(index>=size) {
throw out_of_range("invalid index");
}
return data[index];
}

template <typename T>
void Array<T>::setSize(unsigned int newSize) {
T* const newData=new T[newSize];
const unsigned int Min=size<newSize?size:newSize;
for(unsigned int i=0; i<Min; ++i) {
newData[i]=data[i];
}
delete[] data;
data=newData;
size=newSize;
}

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号