小弟想用模板实现一个线性表,代码如下,可是模板的赋值构造函数好像有问题,下面这段代码运行时总是出错,请大家帮忙看看,一块分析一下,谢谢!!!我的编译环境时VS2005
/**************头文件******************/
/**
* @file ListSqu.h
* @author Wang Liuqiang
* @version 1.0
* @date 2008-11-30
* @brief 该类实现了线性表的顺序表示
*/
#ifndef LISTSQU_H_
#define LISTSQU_H_
#include <assert.h>
#include <iostream>
using namespace std;
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
#define SQUSUCCEED 0
#define SQUERROR -1
#define SQUOVERFLOW -2
template <class T>
class ListSqu
{
public:
/*
*name 构造函数/析构函数
*@{
*/
ListSqu();
~ListSqu();
ListSqu(const ListSqu<T>& ls);
ListSqu<T>& operator=(const ListSqu<T>& ls);
/** @}*/ //构造函数/析构函数
public:
/*
* 清空顺序表
* @return 返回函数执行结果:
* -0 表示执行成功
* -1 表示执行出错
*/
int ClearList();
/*
* 判断顺序表是否为空
* @return 返回函数执行结果:
* -true 表示顺序表为空
* -false 表示顺序表不为空
*/
bool IsEmpty();
/*
* 返回顺序表中元素个数
* @return 返回顺序表中元素个数
*/
int Length();
/*
* 返回顺序表中第i个位置的元素
* @param[in] i 需要获取元素的位置
* @param[out] e 顺序表中第i个位置的元素值
* @return 返回函数执行结果
* -SQUSUCCEED 表示函数执行成功
* -SQUERROR 表示函数执行失败
* @note C++中数组的下标是从0开始,因此第i个位置的元素应该取下标为i-1的元素
*/
int GetItem(int i, T& e);
/*
* 在顺序表的第i个位置之前插入元素
* @param[in] 元素的插入位置
* @param[in] 插入元素值
* @return 返回函数的执行结果
* -SQUSUCCEED 表示函数执行成功
* -SQUERROR 表示函数执行失败
*/
int InsertItem(int i, T& e);
/*
* 删除顺序表中第i个位置的元素
* @param[in] i 待删除元素位置
* @param[out] e 删除元素的值
* @return 返回函数的执行结果
* -SQUSUCCEED 表示函数执行成功
* -SQUERROR 表示函数执行失败
*/
int DeleteItem(int i, T& e);
/*
* 显示顺序表中元素
* @return 返回函数的执行结果
* -SQUSUCCEED 表示函数执行成功
* -SQUERROR 表示函数执行失败
*/
int Show(); // 输出表中元素
private:
T* items;
int length;
int listsize;
};
template <class T>
ListSqu<T>::ListSqu()
{
items = new T[LIST_INIT_SIZE];
assert(items);
length = 0;
listsize = LIST_INIT_SIZE;
}
template <class T>
ListSqu<T>::~ListSqu()
{
if (items != NULL)
{
delete[] items;
items = NULL;
}
}
template <class T>
ListSqu<T>::ListSqu(const ListSqu<T>& ls)
{
length = ls.length;
listsize = ls.listsize;
items = new T[listsize + 1];
memcpy(items, ls.items, _msize(ls.items));
}
template <class T>
ListSqu<T>& ListSqu<T>::operator=(const ListSqu<T>& ls)
{
if( this == &ls )
return *this;
delete[] items;
items = NULL;
length = ls.length;
listsize = ls.listsize;
items = new T[length + 1];
memcpy(items, ls.items, _msize(ls.items));
return *this;
}
template <class T>
int ListSqu<T>::ClearList()
{
length = 0;
return SQUSUCCEED;
}
template <class T>
bool ListSqu<T>::IsEmpty()
{
return length == 0;
}
template <class T>
int ListSqu<T>::GetItem(int i, T& e)
{
if ( (i < 1) || ( i > length ))
{
cout<<"所给位置超出位置索引!"<<endl;
return SQUERROR;
}
else
{
e = items[i -1];
return SQUSUCCEED;
}
}
template <class T>
int ListSqu<T>::InsertItem(int i, T& e)
{
if ( i < 1 || i > length + 1)
{
cout<<"所给位置出错!"<<endl;
return SQUERROR;
}
else
{
if (length >= listsize)
{
T* pNew = new T[LISTINCREMENT];
memcpy(pNew, items, _msize(items));
items = pNew;
if (items == NULL)
{
cout<<"申请内存空间失败!"<<endl;
return SQUOVERFLOW;
}
listsize += LISTINCREMENT;
}
for(int k = length; k >= i - 1; k--)
{
items[k+1] = items[k];
}
items[i-1] = e;
length++;
return SQUSUCCEED;
}
}
template <class T>
int ListSqu<T>::DeleteItem(int i, T& e)
{
if ( i < 1 || i > length )
{
cout<<"所给删除位置出错!"<<endl;
return SQUERROR;
}
e = items[i-1];
for (i = i -1; i < length; i++)
{
items[i] = items[i + 1];
}
length--;
return SQUSUCCEED;
}
template <class T>
int ListSqu<T>::Show()
{
for (int i = 0; i < length; i++)
{
cout<<items[i]<<endl;
}
return SQUSUCCEED;
}
#endif
/************main.cpp*****************/
#include "ListSqu.h"
void main()
{
ListSqu<int> listtest;
for (int i = 0; i < 10; i++)
{
listtest.InsertItem(i+1, i);
}
listtest.Show();
ListSqu<int> listtest1;
listtest1 = listtest;
//ListSqu<int> listtest1 = listtest; // 将上面两句使用这句代码替换,没有错误
listtest1.Show();
}