更新:
1、第一版的代码在析构函数部分违反了《effective C++》条款16:“………如果你调用new时使用使用[],你必须在对应调用delete时也使用[]。如果你调用new时没有使用[],那么也不该在对应调用delete时使用[]……”,错误保留在注释中。
2、第一版代码还犯了另一个错误,考虑如下代码
template<typename T>
const bool& Queue<T>::IsFull()
{
return ((Rear + 1) % MaxSize == Front);
}
函数的返回类型是引用类型,但引用绑定的对象是函数内的局部变量,这将导致错误,错误保留在注释中。
非常吊诡的事情是:这两种错误在VS2017下都能被运行,也就是程序能正常跑……,知识浅薄,希望以后能搞清楚原因。
#pragma once
#include<iostream>
using std::cout;
using Position = int;
template<typename T>
class Queue
{
public:
Queue(int MaxSize=16);
~Queue();
/*错误代码记录
const bool& IsFull();//判断队列是否满
const bool& IsEmpty();//判断队列是否为空;
const bool& AddQ(const T& X);//入队
*/
bool IsFull();//判断队列是否满
bool IsEmpty();//判断队列是否为空;
bool AddQ(const T& X);//入队
const T & Delete();//出队
private:
Position Front, Rear;//队列的头和尾
T* Data;//存放数据的数组
int MaxSize;//队列最大容量
};
template<typename T>
Queue<T>::Queue(int MaxSize):Data{new T[MaxSize]},Front{ 0 }, Rear{0},MaxSize{MaxSize}{}
template<typename T>
Queue<T>::~Queue()
{
//delete Data;错误代码记录
delete[] Data;
}
template<typename T>
//const bool& Queue<T>::IsFull()错误代码记录
bool Queue<T>::IsFull()
{
return ((Rear + 1) % MaxSize == Front);
}
template<typename T>
//const bool& Queue<T>::AddQ(const T& X)错误代码记录
bool Queue<T>::AddQ(const T& X)
{
if (IsFull()) {
cout << "队列满\n";
return false;
}
else {
Rear = (Rear + 1) % MaxSize;
Data[Rear] = X;
return true;
}
}
template<typename T>
//const bool& IsFull()错误代码记录
bool Queue<T>::IsEmpty()
{
return (Front == Rear);
}
template<typename T>
const T & Queue<T>::Delete()
{
if (!IsEmpty()) {
Front = (Front + 1) % MaxSize;
return Data[Front];
}
}
#include"SeqQueue.h"
int main()
{
Queue<int> Q{};
for (int i = 0; i < 15; ++i) {
Q.AddQ(i);
}
cout << "Q是否满 " << Q.IsFull() << '\n';
cout << "Q是否空 " << Q.IsEmpty() << '\n';
for (int i = 0; i < 15; ++i) {
cout << Q.Delete() << ' ';
}
cout << '\n' << "Q是否满 " << Q.IsFull() << '\n';
cout << "Q是否空 " << Q.IsEmpty() << '\n';
return 0;
}