【问题标题】:Pushing to custom stack class freezing .exe推送到自定义堆栈类冻结 .exe
【发布时间】:2013-05-21 06:17:50
【问题描述】:

我正在使用堆栈类,但是每次我将某些内容推送到堆栈时,一旦到达代码推送行,可执行文件就会冻结并停止工作。

能否请我帮忙解释一下为什么?

我的堆栈.h:

#ifndef STACK_H
#define STACK_H
#include <cassert>

namespace standard
{
    class Stack
    {
    public:
        static const int CAPACITY = 30;
        void stack() {used=0;};
        void push (const char entry);
        void pop();
        bool empty() const;
        int size() const;
        char top() const;
    private:
        char data[CAPACITY];
        int used;
    };
}

#endif

我的 stack.cpp:

#include "stack.h"

namespace standard
{
    void Stack::push(const char entry)
    {
        assert(size() < CAPACITY);
        data[used] = entry;
        ++used;
    }

    void Stack::pop()
    {
        assert(!empty());
        --used;
    }

    char Stack::top() const
    {
        assert(!empty());
        return data[used-1];
    }

    int Stack::size() const
    {
        return used;
    }

    bool Stack::empty() const
    {
        if (size() == 0)
            return true;
        else
            return false;
    }
}

我的 calc.cpp:

#include "stack.h"
#include <iostream>
#include <fstream>

using namespace std;
using namespace standard;

    void main()
    {
        Stack myStack;
        ifstream input;
        input.open("tests.txt");
        if (input.fail())
        {
            cerr << "Could not open input file." << endl;
            exit(0);
        }
        char i;
        input >> i;
        cout << i;
        myStack.push(i);  // This is where things go wrong.
        cin.get();
    }

感谢您的帮助!

【问题讨论】:

    标签: c++ class stack


    【解决方案1】:

    看起来你没有初始化used,你有一些看起来像构造函数的东西,但它不是:

    void stack() {used=0;};
    

    它应该是这样的:

    Stack() { used=0;};
    

    因此,如果没有构造函数 used 将是一些不确定的值,并且最终可能会导致您尝试访问 data 越界。同样main 应该总是返回int

    【讨论】:

    • 非常感谢!这解决了问题。
    【解决方案2】:
    void stack() {used=0;}; 
    

    应该大写吗?并消除虚空!

    Stack myStack;
    

    应该这样

    Stack myStack = new Stack();
    

    如果你不初始化它,变量myStack将是一个“空指针”。

    【讨论】:

      【解决方案3】:

      我认为你写错了这个函数:

      void stack() {used=0;};
                           //^^extra ; here
      

      应该是

      Stack() {used = 0;}
      //^^Note that constructor has no return type
      

      您从未真正使用过返回 void 的 stack 成员函数。这导致used 从未初始化过。您可能是指Stack 的构造函数。同时,你应该使用构造函数初始化列表:

      Stack(): used(0) {}
      

      【讨论】:

        猜你喜欢
        • 2021-08-30
        • 1970-01-01
        • 2011-03-20
        • 2016-05-31
        • 2019-04-26
        • 1970-01-01
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        相关资源
        最近更新 更多