(2011.07.19)C++ 顺序表 destructor tag mismatch错误!

// 4.1 假设一个线性表包含下列元素:
// < 12, 23, 15, 5, 9 >
// 用顺序表写出这些元素,并且删除值为15的元素。


#include <iostream>
using namespace std;


const int Default = 5;


template < typename  Elem >
class List
{
public:
Elem element;
List *next;
};


template <typename Elem>
class AList: public List<Elem>
{
private:
int MaxSize;
int fence;
int ListSize;
Elem * ArrayList;


public:
AList (int size = Default)
{
MaxSize = size;
ListSize = 0;
fence = 0;
Elem * Arraylist = new Elem[size];
cout << "Creat Success! ";
}


~Alist ()
{
delete [] Arraylist;
ListSize = 0;
MaxSize = 0;
fence = 0;
cout << " Destory Success! ";
}




bool insert(Elem & elemval)
{
if (fence == Maxsize) return false;
for (int i = ListSize; i > fence; i--)
ArrayList[i] = ArrayList[i - 1];
ArrayList[fence] = elemval;
++ListSize;
fence++;
}


bool find(Elem & elemval)
{
for (int i = 0; i < ListSize; i++)
{
if (elemval == ArrayList[i]) 
{
fence = i;
return 1;
}
}
return 0;
}


bool del(Elem & elemval)
{
for (int i = ListSize; i < fence; i--)    // 算法错
ArrayList[i - 1] = ArrayList [i];
ListSize--;
}


void show()
{
for (int i = 0; i < ListSize; i++)
cout <<  ArrayList[i] << ' ';
}
};


int main()
{
AList<int> arow;
int t[5] = {12, 23, 15, 5, 9};
for ( int i = 0; i < 5; i++)
arow.insert(t[i]);
if(arow.find(t[2]))
arow.del(t[2]);
else
cout << "delete error";
arow.show();
return 0;
}









/****


1>------ 已启动生成: 项目: test, 配置: Debug Win32 ------
1>正在编译...
1>41 delete a element - 副本.cpp
1>g:\temp\新建文件夹\41 delete a element - 副本.cpp(37) : error C2523: 'AList<Elem>::~Alist' : destructor tag mismatch
1>        g:\temp\新建文件夹\41 delete a element - 副本.cpp(82) : see reference to class template instantiation 'AList<Elem>' being compiled
1>g:\temp\新建文件夹\41 delete a element - 副本.cpp(37) : error C2523: 'AList<Elem>::~Alist' : destructor tag mismatch
1>        with
1>        [
1>            Elem=int
1>        ]
1>        g:\temp\新建文件夹\41 delete a element - 副本.cpp(86) : see reference to class template instantiation 'AList<Elem>' being compiled
1>        with
1>        [
1>            Elem=int
1>        ]
1>生成日志保存在“file://g:\Temp\新建文件夹\test\test\Debug\BuildLog.htm”
1>test - 2 个错误,0 个警告
========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ==========


*/


/************
你new到局部新定义的指针了,函数返回这个地址就没了,new的内存也就那么放着没法用,也就是内存泄露了
类里不是有个成员指针么,直接用他就行
//Elem * Arraylist = new Elem[size];
ArrayList = new Elem[size];
*****************************************/



正确的代码:

// 4.1 假设一个线性表包含下列元素:
// < 12, 23, 15, 5, 9 >
// 用顺序表写出这些元素,并且删除值为15的元素。

#include <iostream>
using namespace std;

const int Default = 5;

template < typename  Elem >
class List
{
	public:
		Elem element;
		List *next;
};

template <typename Elem>
class AList: public List<Elem>
{
	private:
	int MaxSize;
	int fence;
	int ListSize;
	Elem * ArrayList;

	public:
	AList (int size = Default)
	{
		MaxSize = size;
		ListSize = 0;
		fence = 0;
		ArrayList = new Elem[size];
		cout << "Creat Success! ";
	}

	~AList ()
	{
		delete [] ArrayList;
		ListSize = 0;
		MaxSize = 0;
		fence = 0;
		cout << " Destory Success! ";
	}


	bool insert(Elem & elemval)
	{
		if (fence == MaxSize) return false;
		for (int i = ListSize; i > fence; i--)
			ArrayList[i] = ArrayList[i - 1];
		ArrayList[fence] = elemval;
		++ListSize;
		fence++;
		return true;
	}

	bool find(Elem & elemval)
	{
		for (int i = 0; i < ListSize; i++)
			{
			if (elemval == ArrayList[i]) 
				{
				fence = i;
				return 1;
				}
			}
		return 0;
	}

	bool del(Elem & elemval)
	{
		for (int i = fence; i < ListSize; i++)
			ArrayList[i] = ArrayList [i + 1];
		ListSize--;
		return true;
	}

	void show()
	{
		for (int i = 0; i < ListSize; i++)
			cout <<  ArrayList[i] << ' ';
	}
};

int main()
{
	AList<int> arow;
	int t[5] = {12, 23, 15, 5, 9};
	for ( int i = 0; i < 5; i++)
		arow.insert(t[i]);
	if(arow.find(t[2]))
		arow.del(t[2]);
	else
		cout << "delete error";
	arow.show();
	cin.get();
	return 0;
}

		



// 建立项目应建控制台。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值