C++类实现二维数组

样例已给出并完成一维数组的定义。起初以为要在一维的基础上对代码做修改,增加或变更数据成员和成员函数。但出现了不知道如何进行 Array2d[i][j]的问题。因为operator[]只能在类中对单个[]进行重载,这极大地限制了二维数组直接从一维变更的实现。

查阅思考无方。最后在百度知道获得启示,即建立一个另外的二维数组类,在类中添加元素为一维数组的大数组数据成员,可用指针表示。这样operator[]在重载时自顾自就好,原一维的可以分担一个[]。

一维数组类代码:

写在头文件arrayd1.h中。

#include<assert.h>
#include<iostream.h>
template <class T>
class Array1D
{
public:
		Array1D(int sz=0);
		~Array1D(){delete []elements;}
		T& operator [](int i)const;
		Array1D<T>&operator = (const Array1D<T> &r);
		friend istream &operator>>(istream &in, Array1D<T> &r);
		friend ostream &operator<<(ostream &out,const Array1D<T> &r);
private:
		int size;
		T *elements;
};

template <class T>
Array1D<T>::Array1D(int sz)
{
	assert(sz>=0);
	size=sz;
	elements = new T[sz];
}

template <class T>
T& Array1D<T>::operator [](int i)const
{	
	assert(i>=0 && i<size);
	return elements[i];
}

template <class T>
Array1D<T>& Array1D<T>::operator =(const Array1D<T> &r)
{
	if(this!=&r)
	{
		size = r.size;
		delete []elements;
		elements = new T[size];
		for(int i=0; i<size; i++)
		{
			elements[i] = r.elements[i];
		}
		
	}
	return *this;
}

template <class T>
istream &operator>>(istream &in, Array1D<T> &r)
{
	cout<<"Input array\n";
	for(int i=0; i<r.size; i++) in>>r.elements[i];
	return in;
}

template <class T>
ostream &operator<<(ostream &out, const Array1D<T> &r)
{
	cout<<"Array=";
	for(int i=0; i<r.size; i++) out<<r.elements[i]<<' ';
	out<<endl;
	return out;
}

重点是operator的使用。在上述过程和后续过程都对符号进行了重载。并且[] 和 = 以 T&为返回值。用了引用做返回值的函数。这么一来,函数既可以被直接使用,也可以在赋值=左右两边出现。可以传递函数生成并返回的值。这里的符号[] = 就可以让数组传值和赋值。

二维数组的代码:

写在头文件arrayd2.h中。

#include "arrayd1.h"
template <class T>
class Array2D
{
public:    
            Array2D(int row =0,int col = 0);
            ~Array2D();
            T& operator[](int i)const;
            Array2D<T>&operator=(const Array2D<T> &r);
            friend istream &operator>>(istream &in, Array2D<T> &r);
            friend ostream &operator<<(ostream &out, const Array2D<T> &r);
private:
            int Row;
            int Col;
            Array1D<T> *d2_elements;
};

template <class T>
Array2D<T>::Array2D(int row,int col)
{
	assert(col>=0 && row>=0);
	Row = row;
	Col = col;
	d2_elements = new Array1D<T>[Row];
	for(int i=0; i < Row; i++)
	{
		d2_elements[i] = Array1D<T>(Col);
	}
}

template <class T>
Array2D<T>::~Array2D()
{
	delete[] d2_elements;
}

template <class T>
T& Array2D<T>::operator [](int i)const
{
	assert(i>=0 && i<Row);
	return d2_elements[i];
}

template <class T>
Array2D<T>& Array2D<T>::operator=(const Array2D<T> &r)
{
	if(this!=&r)
	{
		Col = r.Col;
		Row = r.Row;
		int i=0,j=0;
		

                delete[] d2_elements;

		d2_elements = new Array1D<T>[r.Row]; 
		for(i=0; i<Row; i++)
		{
			d2_elements[i] = Array1D<T>(r.Col);
		}

		for(i=0; i<Row; i++)
		{
			for(j=0; j<Col; j++)
			{
				d2_elements[i][j] = r.d2_elements[i][j];
			}
		}
	}
	return *this;
}

template<class T>
istream &operator>>(istream &in, Array2D<T> &r)
{
	int i=0,j=0;
	for(i=0; i<r.Row; i++)
	{
		for(j=0; j<r.Col; j++)
		{
			in>>r.d2_elements[i][j];
		}
	}
	return in;
}

template <class T>
ostream &operator<<(ostream &out, const Array2D<T> &r)
{
	int i=0,j=0;
	cout<<"Array = "<<endl;
	for(i; i<r.Row; i++)
	{
		for(j=0; j<r.Col; j++)
		{
			out<<r.d2_elements[i][j]<<' ';
		}
		out<<endl;
	}
	return out;
}

d2_elements = new Array1D<T>[r.Row]; 类似这种,一定要区别new 类型名后跟的是[]还是()。前者创建数组,后者仅仅是(填上参数)表示创建单个对象的动态空间。在这里建立承载几个小一维数组的大数组才是我们需要的。

然后可以随便给出主函数,用来测试:

例子 main.cpp

#include "arrayd2.h"

void main()
{
	Array2D<int> a(3,4),b(3,4);
	cin>>a; cout<<"a "<<a;
	cin>>b; cout<<"b "<<b;
	b=a; cout<<"Result b is : "<<b;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值