1

スタック クラスを使用していますが、何かをスタックにプッシュするたびに、実行可能ファイルがフリーズし、プッシュするコード行に到達すると動作が停止します。

理由を教えてください。

私のstack.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();
    }

助けてくれてありがとう!

4

3 に答える 3

1

usedここにコンストラクターのように見えるものがありますが、そうではありません:

void stack() {used=0;};

これは次のようになります。

Stack() { used=0;};

したがって、コンストラクターがないと、不確定な値になり、おそらく範囲外usedにアクセスしようとすることになります。dataまたmain、常に を返す必要がありintます。

于 2013-05-26T01:32:43.643 に答える
1
void stack() {used=0;}; 

これは大文字にするべきですか?&ボイドを削除!

Stack myStack;

これであるべきか

Stack myStack = new Stack();

初期化しないと、変数myStackは「ヌルポインター」になります。

于 2013-05-26T01:35:06.187 に答える
1

この関数を間違って書いたと思います:

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

する必要があります

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

stackvoid を返すメンバー関数を実際に使用したことがありません。これにより、usedが初期化されていないという事実が生じます。あなたはおそらくのコンストラクタを意味しStackます。その間、コンストラクターの初期化リストを使用する必要があります。

Stack(): used(0) {}
于 2013-05-26T01:35:13.823 に答える