做出了老师说的模板类,但是运行时提示runtime library,帮忙看下

来源:5-1 队列的实际应用

宝慕林3490596

2017-02-13 16:09

//头文件 MyQueue.h

#ifndef MYQUEUE_H
#define MYQUEUE_H
#include <iostream>
#include <string>
using namespace std;

template <typename T>
class MyQueue
{
public:
MyQueue::MyQueue(int queueCapacity)
{
	m_iQueueCapacity = queueCapacity;
	m_iHead = 0;
	m_iTail = 0;
	m_iQueueLen = 0;
	m_pQueue = new T[m_iQueueCapacity];
}

MyQueue::~MyQueue()
{
	delete m_pQueue;
	m_pQueue = NULL;
}

void MyQueue::ClearQueue()
{
	m_iHead = 0;
	m_iTail = 0;
	m_iQueueLen = 0;
}

bool MyQueue::QueueEmpty() const
{
	if (m_iQueueLen == 0)
	{
		return true;
	}
	else
	{
		return false;
	}
	//return m_iQueueLen == 0 ? true:false;
}

bool MyQueue::QueueFull() const
{
	if (m_iQueueLen == m_iQueueCapacity)
	{
		return true;
	}
	else
	{
		return false;
	}
	//return m_iQueueLen==m_iQueueCapacity? true:false;
}

T MyQueue::QueueLength() const
{
	return m_iQueueLen;
}

bool MyQueue::EnQueue(T element)
{
	if (QueueFull() == true)
	{
		return false;
	}
	else
	{
		m_pQueue[m_iTail] = element;
		m_iTail++;
		m_iTail = m_iTail%m_iQueueCapacity;
		m_iQueueLen++;
		return true;
	}
}

bool MyQueue::DeQueue(T & element)
{
	if (QueueEmpty() == true)
	{
		return false;
	}
	else
	{
		element = m_pQueue[m_iHead];
		m_iHead++;
		m_iHead = m_iHead%m_iQueueCapacity;
		m_iQueueLen--;
		return true;
	}
}

void MyQueue::QueueTraverse()
{
	for (int i = m_iHead;i < m_iHead + m_iQueueLen;i++)
	{
		cout << m_pQueue[i%m_iQueueCapacity] << endl;
	}
}

private:
	T *m_pQueue;										//队列数组指针
	int m_iQueueLen;									//队列元素个数
	int m_iQueueCapacity;								//队列数组容量
	int m_iHead;										//队列头
	int m_iTail;										//队列尾
};




#endif
//源文件 demo.cpp

#include "MyQueue.h"

int main()
{
	MyQueue<string> *p=new MyQueue<string>(4);
	p->EnQueue("A");
	p->EnQueue("1");
	p->EnQueue("6");
	p->EnQueue("8");
	p->QueueTraverse();
	string e="0";
	p->DeQueue(e);
	cout << e << endl;
	p->DeQueue(e);
	cout << e << endl;
	
	p->QueueTraverse();
	p->ClearQueue();
	p->QueueTraverse();
	p->EnQueue("c");
	p->EnQueue("f");
	p->QueueTraverse();
	delete p;
	p=NULL;
}

错误提示如图,求大神指点下哪里错了

58a1698c0001775604780374.jpg

58a1698d00014c8a05000327.jpg


写回答 关注

1回答

  • 慕神7694260
    2017-02-15 20:44:26

    改好了

    类内定义函数不用加作用域限定符

    以下代码

    //源文件 demo.cpp
     
    #include "MyQueue.h"
    #include <iostream>
    using namespace std; 
     
    int main()
    {
        MyQueue<string> *p=new MyQueue<string>(4);
        p->EnQueue("A");
        p->EnQueue("1");
        p->EnQueue("6");
        p->EnQueue("8");
        p->QueueTraverse();
        string e="0";
        p->DeQueue(e);
        cout << e << endl;
        p->DeQueue(e);
        cout << e << endl;
         
        p->QueueTraverse();
        p->ClearQueue();
        p->QueueTraverse();
        p->EnQueue("c");
        p->EnQueue("f");
        p->QueueTraverse();
        delete p;
        p=NULL;
        return 0;
    }
    //头文件 MyQueue.h
     
    #ifndef MYQUEUE_H
    #define MYQUEUE_H
    #include <iostream>
    #include <string>
    using namespace std;
     
    template <typename T>
    class MyQueue
    {
    public:
    MyQueue(int queueCapacity)
    {
        m_iQueueCapacity = queueCapacity;
        m_iHead = 0;
        m_iTail = 0;
        m_iQueueLen = 0;
        m_pQueue = new T[m_iQueueCapacity];
    }
     
    ~MyQueue()
    {
        delete m_pQueue;
        m_pQueue = NULL;
    }
     
    void ClearQueue()
    {
        m_iHead = 0;
        m_iTail = 0;
        m_iQueueLen = 0;
    }
     
    bool QueueEmpty() const
    {
        if (m_iQueueLen == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
        //return m_iQueueLen == 0 ? true:false;
    }
     
    bool QueueFull() const
    {
        if (m_iQueueLen == m_iQueueCapacity)
        {
            return true;
        }
        else
        {
            return false;
        }
        //return m_iQueueLen==m_iQueueCapacity? true:false;
    }
     
    T QueueLength() const
    {
        return m_iQueueLen;
    }
     
    bool EnQueue(T element)
    {
        if (QueueFull() == true)
        {
            return false;
        }
        else
        {
            m_pQueue[m_iTail] = element;
            m_iTail++;
            m_iTail = m_iTail%m_iQueueCapacity;
            m_iQueueLen++;
            return true;
        }
    }
     
    bool DeQueue(T & element)
    {
        if (QueueEmpty() == true)
        {
            return false;
        }
        else
        {
            element = m_pQueue[m_iHead];
            m_iHead++;
            m_iHead = m_iHead%m_iQueueCapacity;
            m_iQueueLen--;
            return true;
        }
    }
     
    void QueueTraverse()
    {
        for (int i = m_iHead;i < m_iHead + m_iQueueLen;i++)
        {
            cout << m_pQueue[i%m_iQueueCapacity] << endl;
        }
    }
     
    private:
        T *m_pQueue;                                       //队列数组指针
        int m_iQueueLen;                                   //队列元素个数
        int m_iQueueCapacity;                              //队列数组容量
        int m_iHead;                                       //队列头
        int m_iTail;                                       //队列尾
    };
     
     
     
     
    #endif

    还有,demo.cpp可能还有点小问题,不过影响不大,程序能正常运行

    再来张图

    http://img.mukewang.com/58a44d230001f47c19201080.jpg

    宝慕林349...

    用你给的代码测试还是会提示runtime library,不知道是不是编译器或者电脑的问题,我用的是VS2015专业版 不过这种类内定义的编译习惯确实不太好,虽然不用敲那么多代码,减少些麻烦,不过后面可读性差,但是放在CPP里定义就要每条都加template<typename T>了,虽然没解决,但还是很感谢你的回答

    2017-02-16 21:08:04

    共 1 条回复 >

数据结构探险—队列篇

与现实最为贴近的数据结构-队列,带大家进入数据结构的美妙世界

110035 学习 · 170 问题

查看课程

相似问题