C++ 成员变量重置回0

C++ 成员变量重置回0,c++,class,C++,Class,当运行测试时,当使用其pop函数时,类stack1中的count变量被重置回0。然而奇怪的是,在推循环过程中,计数会按预期增加,但当pop发生时,计数会重置为0,并从中减去负数。有什么我忘了的吗 #include <iostream> using namespace std; class TheStack { public: TheStack(); void push(int); int pop(); boo

当运行测试时,当使用其pop函数时,类stack1中的count变量被重置回0。然而奇怪的是,在推循环过程中,计数会按预期增加,但当pop发生时,计数会重置为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");

}
#包括
使用名称空间std;
上等货
{
公众:
鞋钉();
无效推力(int);
int-pop();
bool是空的();
私人:
常量int MaxSize=10;
int-arr[10];
整数计数;
};
TheStack::TheStack()
{
计数=0;
}
void TheStack::push(int userInput)
{
如果(计数>=MaxSize)
{

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

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

当您执行
推送
时,您首先将数据保存到数组中,然后递增
计数
。这意味着为了正确执行
弹出
操作,您需要反向操作:首先递减
计数
和然后从阵列中读取数据

但在代码中,您是在反向执行。当堆栈已满时,
count
处于最大值(
10
,在您的情况下),并且您的
arr[count]=NULL;
写入超出数组边界。这会导致未定义的行为,尤其是破坏
count
值。(这就是为什么它突然变成
0

此外:

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

    这到底有什么意义呢?最初,您的数组包含的垃圾位于堆栈的当前顶部之上。为什么在执行
    pop
    之后突然想要清理它

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

  • 类定义中的
    const int MaxSize=10;
    是C++11的一项功能。由于您已经在使用C++11,您可以对
    count
    执行相同的操作。只需在类定义中执行
    int count=0;
    即可,无需显式编写构造函数

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


  • 当您按下
    按钮时,首先将数据保存到数组中,然后递增
    计数
    。这意味着为了正确执行
    弹出
    ,您需要反向操作:首先递减
    计数
    ,然后才从数组中读取数据

    但在代码中,您是在反向执行。当堆栈已满时,
    count
    处于最大值(
    10
    ,在您的情况下),并且您的
    arr[count]=NULL;
    写入超出数组边界。这会导致未定义的行为,尤其是破坏
    count
    值。(这就是为什么它突然变成
    0

    此外:

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

    这到底有什么意义呢?最初,您的数组包含的垃圾位于堆栈的当前顶部之上。为什么在执行
    pop
    之后突然想要清理它

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

  • 类定义中的
    const int MaxSize=10;
    是C++11的一项功能。由于您已经在使用C++11,您可以对
    count
    执行相同的操作。只需在类定义中执行
    int count=0;
    即可,无需显式编写构造函数

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


  • 对于NULL,我只是想说明数组是出于分配的目的从成员中“弹出”的。不确定是否有比将其重新分配到0更好的方法?对于pop()也是如此,我需要更改它吗?如果我返回某个值,则main中的cout会将该值吐出。@Michael Li:如果要将其设置为
    0
    ,请将其设置为
    0
    。在这种上下文中,不设置为
    NULL
    NULL
    是完全不合适的。但是,如果您只保持数组元素在r
    pop
    。对于空值,我只是想说明数组是出于赋值的目的从成员中“弹出”的。不确定是否有比将其重新赋值为0更好的方法?对于pop()也是如此,我需要更改它吗?如果我返回某个值,则main中的cout会将该值吐出。@Michael Li:如果要将其设置为
    0
    ,请将其设置为
    0
    。在这种上下文中,不设置为
    NULL
    NULL
    是完全不合适的。但是,如果您只保持数组元素在r
    pop