我和你的代码一致,所以排除是MyQueue.cpp文件的问题,据我猜测是demo.cpp文件的问题,
就是已经定义好的东西
例:
#include<iostream>
或
int main()
{
}
或
if(~~~~~~)
{
}
else
{
}
都是已定义好的模板!!!
MyQueue *p = new MyQueue(4);
申请内存哇
main()函数结束后才能被收回吧,所有在main结束前打印没有问题
缺省值在Customer类的构造函数的声明中写就可以了。
譬如:
Customer(string name = "",int age = 0);
在.cpp文件中实现Customer构造函数如下:
Customer:Customer(string name,int age){
}
环形嘛:c1->c2->c3->c4->c1 这样子,理解环形就理解这个。
Queue(int queueCapacity)//创建队列
{
m_pQueue = new Customer[m_iQueueCapacity];//这里的m_iQueueCapacity并没有初始值,无法分配数组,应该是笔误,应该改成queueCapacity
ClearQueue();
m_iQueueCapacity = queueCapacity;
}
自己另外写一个无参的构造函数就行了
哦,这个做法对于删除操作是没有意义的。
老师这么做目的在于执行程序时能从小黑框里给我们看见被删除的是哪个元素,所以在删除函数里把删除的值赋给一个变量,并在主函数里打印这个变量。
我们写的时候由于懂了队列的原理,就可以在删除函数里去掉给这个变量赋值的操作,并在参数列表里把这个参数删去。
不需要改变对象内容的函数都作为const成员函数,可防止成员变量被修改。
不好意思,第85行的QueueEmpty()函数调用多了一对括号。
Customer的数据类型换成string的数据类型
大哥你没有对应的无参构造函数或有参的默认构造函数。。。。。
上课老师不是讲了吗,你在构造函数上赋个默认值就好了
因为作为一个类,它的构造函数是有参的,可是它在主函数中没有初始化,故需要赋值
系统按顺序应该先删除customer的内存,然后再是p的内存。而customer的内存是栈实例化的,所以只有执行了return 0;后才会删除。使用了delete p;会导致系统先删除queue的内存,顺序不对,所以执行出现问题。所以不能加delete p;在结束整个程序后就会自动删除。我个人见解,删除内存主要运用在一个程序没有完结但一个类或函数已经完结的情况下,可以减少内存泄漏。如果整个程序都结束,就不存在内存泄漏的问题了。
全部从源文件添加啊
改好了
类内定义函数不用加作用域限定符
以下代码
//源文件 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可能还有点小问题,不过影响不大,程序能正常运行
再来张图
你仔细看他的DeQueue,是直接将第一个元素赋值给引用的c4的。
举例来说,有一个序列为【1,5,3,4,2】;
那么正序为【1,5,3,4,2】;逆序则为【2,4,3,5,1】;
应该是说改成delete p就对了。
先出按照奇数排列的数据 再出按照偶数排列的数据 不难的
因为在这个队列中操作的是 顾客 这个类的对象,队列的每一个元素都是顾客,在使用 MyQueue *p=MyQueue(4)
新建一个容量为4队列时,必须要在堆中申请一个对象数组的内存,也就是 m_pQueue=new Customer[4],指向一个对象数组的指针必须是对象指针,所以要将 int *m_pQueue改为 Customer *m_pQueue
去买一本数据库的书去看,淘宝一大堆。
加个大括号
按引用传递直接是对对象的操作,不必像按值那样生成一个副本,这样可以提高性能。当然,引用的好处还是非常多的..
vs 2010 你可以看看老师的其他课程 其他课程上有说明他的编译环境与编译器的版本 他提到过用的是vs2010 祝你学习愉快
可能是构造函数那出现的问题 你可以去看看
同学,C语言确实不能用引用啊。但是课上使用的C++啊,C++中是可以使用引用的。
好了,看到后面就知道了