同学们注意了:
class STACK{
int p, c, *e; //c存放元素个数, p存放位置, e用于存放元素
public:
virtual int getp ( ) { return p; }
virtual int push (int f) { return p<c?(e[p++]=f, 1): 0; }
virtual int pop (int&f) { return p>0? (f=e[--p], 1): 0; }
STACK (int m) : e (new int[m]), c (e? m: 0), p (0) { }
virtual ~STACK ( ) { if (e) { delete e; e=0; c=0; p=0; }}
};
class QUEUE: public STACK{//公有派生构成父子关系
STACK s; //s用于出队列, STACK用于入队列
int c; //栈的深度
public:
virtual int enter (int f)
{ int x;
if(getp( )>=c && s.getp( )==0) while (pop (x)) s.push (x) ;
return (getp( )<c) ? (push (f), 1): 0; }
virtual int leave (int&f)
{ if (!s.getp ( )) while (pop (f)) s.push (f) ;
return (s.getp()) ? (s.pop (f), 1): 0; }
QUEUE (int m) : STACK (m) , s (m) { c=m; }
~QUEUE ( ) { } //自动成为虚析构函数
};
void main (void) { STACK *p=new QUEUE (9) ; delete p; }
这个是幻灯片126页的一个程序,仔细看STACK的构造函数,马光志显然想通过判断分配内存成功与否来决定把堆栈最大容纳个数设置为用户自定义数值或者0
但是我们注意到,C++构造类成员时候是按照定义顺序的,在STACK中,就是p, c, *e,肯定是先决定c的数值后决定e的数值,马光志企图用e初始化的结果去决定c的数值,这肯定是做不到的.
那么可能有人会问了,为什么程序能跑?
这里有两个原因,其一,现在电脑内存普遍较大,分配这么一点内存还是基本没有可能失败的.其二,大部分人使用WINDOWS+VC平台,那么此时e的初始值将为0XCDCDCDCD(MALLOC之后的填充造成)因为0XCDCDCDCD无论如何不会等于零,于是马光志的条件判断自动生效.
在此我还想告诫马光志,不要再拿你那本垃圾教材讲课,你自己凭着良心说,你那里面有几个程序是正常人写的?不要总自作聪明,不要总在课堂上写这些垃圾代码来卖弄你自己的那点可怜的知识!别以为你教的学生都是傻子.