0

記録を正すために、私はC ++にかなり慣れておらず、プログラミングの経験のほとんどはJavaです。配列ベースのスタック実装を作成していますが、スタックに保存されているデータを読み取ることができないようです。

オブジェクトをプッシュすることができ、これは正常に機能しているようです。top()操作をコメントアウトすると、ゼロの出力が成功します。これは、アイテムが少なくとも配列に追加されていることを私が知っていることを示しているようです。

ただし、アイテムを読み取ると、セグメンテーション違反エラーが発生します。簡単なグーグルの後で、私はセグメンテーション違反がアクセスできないデータにアクセスする操作があることを意味することを学びました。これにより、top()関数が配列にアクセスできないと思います。これはクラスのプライベートメンバーですが、OOPに関する以前の知識から、クラスメソッドはすべてのプライベート変数にアクセスできる必要があることがわかりました。

誰かが私をここで正しい方向に向けるのを手伝ってもらえますか?(そのような原始的なデータ構造に対してドキュメントが少し過剰である場合は、お詫びします。削除する必要があるかどうかをお知らせください)。

ありがとう!コードは以下のとおりです。

#include <iostream>
using namespace std;

/*
Class: arrayStack() 
A simple stack implemented with a single array. 
Handles char objects.
*/
class arrayStack {

    int length; //cap on stack length
    int count; //Keeps track of which element in the array to pop from.
    char array[]; //Hold data here

public: 

/*
arrayStack() 
Constructor used to create a stack object. No default constructor exists, the length (l) is a required argument as a parameter to create a stack.
l space is reserved in the array and count is set to -1, the int value required for an empty stack.
*/
arrayStack(int l) 
{
    char array[l];
    length = l;
    count = -1;
}

/*
push() -- return type void.
Method to add a desired char element (o) to the stack. 
*/
void push(char o) 
{   
    array[count] = o;
    count++; //Increment the counter to accurately pull element from array.
}

/*
pop() -- return type char.
Method to remove an element from the stack. Element is pulled from the stack and returned. 
*/
char pop() 
{
    //temp space to store pulled element before returning.
    char temp;
    temp = array[count];

    //Replace popped element with null to reduce memory waste. Then decrement counter for proper functioning of the stack.
    array[count] = '\0'; 
    count--;
    return temp;
}

/*
top() -- return type char.
Method which returns the top element of the function without deleting it from the stack. Useful for inspection and testing, but functionally very similar to pop().
*/
char top() 
{
    //temp space to store pulled element.
    char temp; 
    temp = array[count];
    return temp;
}

/*
isEmpty() -- return type boolean.
Method which checks the stack for elements. If there are no elements, the method returns true. If there exists one or more elements, the method will return false. 
Method is very simple-- a simple check against the count (int) variable. 
*/
bool isEmpty() 
{
    if (count == -1) {
        return true;
    } else {
        return false;
    }
}

/*
size() -- return type int.
Method which returns the number of elements in the stack. 
*/
int size() 
{
    return count++;
}

};

int main() {
arrayStack stack(10);
stack.push('c');
cout << stack.top(); //SEGFAULT OCCURS HERE. 
cout << stack.isEmpty();

return 0;
}
4

1 に答える 1

4

メンバーarrayはまだ初期化されていません:

arrayStack(int l) 
{
    char array[l];
    length = l;
    count = -1;
}

ここで、新しいものを作成しますarray(C ++はVLAをサポートしていないため、とにかく合法であるとは思えません。おそらく次のようになります。

arrayStack(int l) 
{
    array = new char[l];
    length = l;
    count = -1;
}

また、割り当てられたメモリを削除するためにデストラクタを実装する必要があります。つまり、コピーコンストラクターとコピー代入演算子も必要です。

于 2012-07-03T07:29:33.163 に答える