标题:类创建的堆栈
取消只看楼主
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
结帖率:96.25%
已结贴  问题点数:20 回复次数:4 
类创建的堆栈
又出问题了.运行时出错,成员函数ADD第一次运行是没有出错的,增加第二个元素时出错,按运行顺序,错误好像出在析构函数,但却找不出有什么错。

#include <iostream.h>
template <class T>
class Stack
{
    public:
        Stack();
        ~Stack(){delete []stack;}
        Stack<T>& Add(const T& x);
        void Output(ostream& out) const;
        friend istream& operator>>(istream& in,Stack<T>& x);
    private:
        int top;
        int MaxTop;
        T *stack;
};


template <class T>
istream& operator>>(istream& in,Stack<T>& x)
{
    T t;
    cin>>t;
    x.Add(t);
    return in;
}

template <class T>
void Stack<T>::Output(ostream& out) const
{
    int n=top+1;
    for(int i=0;i<n;i++)
        out<<stack[i]<<" ";
    cout<<endl;
}

template <class T>
ostream& operator<<(ostream& out,Stack<T>& x)
{
    x.Output(out);
    return out;
}

template <class T>
Stack<T>::Stack()
{
    MaxTop=0;
    stack=new T[MaxTop+1];
    top=-1;
}



template <class T>
Stack<T>& Stack<T>::Add(const T& x)
{
    if((MaxTop-top)<1)
    {
        MaxTop=2*MaxTop+1;
        T *t=new T[MaxTop];
        for(int i=0;i<top+1;i++)
            t[i]=stack[i];
        delete []stack;
        stack=t;
    }
    stack[++top]=x;
    return *this;
}


void main()
{
    Stack <int> s;
    s.Add(2).Add(23);
    cout<<"s:"<<s;
}
搜索更多相关主题的帖子: 堆栈 
2009-08-22 22:33
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
得分:0 
在网上找到这句话:
变量的作用域问题,如:你是在一个函数体中new的,却在另一个函数体中delete,这时的a变量已经失效了,这时delete会出现a为不认识的标识符的错误;   

文章出处:DIY部落(http://www.)
上面这个类问题就出在析构函数里的delete了,我必须在add这个函数体里new,在另一个函数体(析构函数)里delete,要怎样解决呢?
2009-08-25 23:02
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
得分:0 
只要我去掉析构函数里的delete []stack,运行很正常。
刚才把&这符号去掉了,析构函数里的问题依旧,版主没回答到点子上的,现在的主函数里的add调用只是测试,正常运行时不会这样添加数据的.
弹出错误:damage after normal block(#43),网上查阅可能是不正常释放.
2009-08-25 23:32
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
得分:0 
我也觉得数组初始化大小为1,很不方便,只是想尽量按着书上的要求去做出这道题.果然还是你们高手厉害,我一直是在考虑释放空间怎么出错了,还debug一直追着stack的地址看.原来是申请时出错了,忘了算0*2+1还是等于1,不过按照构造函数里的办法,我在Add里重新申请时也用了&nbsp;T&nbsp;*t=new&nbsp;T[MaxTop+1];&nbsp;&nbsp;运行也正常了。谢谢大家了,这道题卡住我三天了,可以继续看下面的.

[ 本帖最后由 mfkblue 于 2009-8-26 20:08 编辑 ]

未标题-1 拷贝.jpg (116.66 KB)


未标题-1 拷贝.jpg (73.33 KB)
2009-08-26 20:07
mfkblue
Rank: 5Rank: 5
等 级:职业侠客
帖 子:472
专家分:343
注 册:2008-12-21
得分:0 
上面想编辑下把100K的图换成70K的,没想到还变成2张图了.

今天七夕,没有的祝愿大家找到一个。有了的祝你们好运.

[ 本帖最后由 mfkblue 于 2009-8-26 20:16 编辑 ]
2009-08-26 20:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-283466-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.756793 second(s), 9 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved