成员变量重置为0

时间:2018-02-17 02:58:56

标签: c++ class

当运行测试时,使用其pop函数时,类stack1中的count变量将重置为0。然而奇怪的是,在推送循环期间,计数按预期增加,但是当弹出时,计数重置为0并从那里减去负数。有什么我忘记了吗?

#include <iostream>

using namespace std;

class TheStack
{
    public:
        TheStack();
        void push(int);
        int pop();
        bool isEmpty();
    private:
        const int MaxSize = 10;
        int arr[10];
        int count;
};

TheStack::TheStack()
{
    count = 0;
}

void TheStack::push(int userInput)
{
    if (count >= MaxSize)
    {
        cout << "Stack is full." << endl;
    }
    else
    {
        arr[count] = userInput;
        count+=1;
    }
}

int TheStack::pop()
{
    if (isEmpty())
    {
        cout << "Stack is empty." << endl;
    }
    else
    {
        int temp = arr[count];
        arr[count] = NULL;
        count-=1;
        return temp;
    }
}

bool TheStack::isEmpty()
{
    if (count == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}



int main()
{
    TheStack stack1;
    if (stack1.isEmpty())
    {
        cout << "isEmpty() works" << endl;
    }

    stack1.pop();

    for (int i = 0; i < 10; i++)
    {
        stack1.push(i);
    }

    stack1.push(0);

    stack1.pop();
    stack1.pop();
    stack1.pop();
    stack1.pop();

    system("pause");

}

2 个答案:

答案 0 :(得分:2)

执行push时,首先将数据保存到数组中,然后递增count。这意味着为了正确地执行pop,您需要反向工作:首先递减count,然后 从数组中读取数据。

但是在代码中,你正在倒退。当堆栈已满时,count处于最大值(在您的情况下为10),并且您的arr[count] = NULL;写入数组边界之外。这会导致未定义的行为,特别是会破坏您的count值。 (这就是它突然变成0的原因。)

此外:

  1. arr[count] = NULL;毫无意义。 NULL应该在指针上下文中使用,而不是在整数上下文中使用。这甚至不能保证编译。

    无论如何,这有什么意义?最初,您的数组包含堆栈当前顶部上方的垃圾。在执行pop后,为什么突然想要清理它?

  2. 并非pop()的所有控制路径都返回值。这本身就是未定义的行为。

  3. 类定义中的
  4. const int MaxSize = 10;是C ++ 11的一个特性。由于您已经在使用C ++ 11,因此可以对count执行相同的操作。只需在类定义中执行int count = 0;,您就不必显式编写构造函数。

    虽然在您的实施中MaxSize作为static const班级成员会更有意义。在这种情况下,您还可以将数组声明为int arr[MaxSize];

答案 1 :(得分:0)

您必须先减少count,然后再访问arr[count]中的int TheStack::pop()。现在,您可以访问最后一个推送元素,如果堆栈已满,则事件超出数组范围。