在头文件中使用类变量时的误解

Misunderstanding in use of class variables from a header file

本文关键字:类变量 误解 文件      更新时间:2023-10-16
struct TodoItem
{
    std::string todo;
};
const int MAX_STACK_SIZE = 5;
class TodoStackArray
{
  public:
    TodoStackArray();  //confusion here<---
    bool isEmpty();  
    bool isFull();  
    void push(std::string todoItem);  
    void pop();  
    TodoItem* peek();  
    /* for grading purposes we need these following methods */  
    int getStackTop()    { return stackTop; }  
    TodoItem** getStack() { return stack; }   
  private:  
    int stackTop;  
    TodoItem* stack[MAX_STACK_SIZE];  
};  
上面的

是当前赋值的一些声明和头文件中的一个类。我们的任务是使用这个头文件实现一个堆栈程序。然而,我对头文件中的TodoStackArray()的目的有点困惑。这应该是一个基构造函数吗?我要用它做什么吗??

我知道这有点具体情况,但鉴于堆栈数组是STL,我想你可能都能提供一些见解。谢谢!

如果你想看看我对这个头文件做了什么…

TodoStackArray::TodoStackArray() //This, unsurprisingly, produces an error.
{
    stackTop = -1;
    stack[stackTop];
}
bool TodoStackArray::isEmpty()
{
    return (stackTop == -1);
}
TodoItem* TodoStackArray::peek()
{
    if(stackTop ==-1)
    {   
        cout<< "Stack empty, cannot peak."<<endl;
    }
    else
    {
        return(stack[stackTop]);
    }
}
bool TodoStackArray::isFull()
{
    return(stackTop == 4);
}
void TodoStackArray::push(std::string todoItem)
{
    if(stackTop >= 5)
    {
        cout<<"Stack full, cannot add new todo item."<<endl;
    }
    else
    {
        stack[stackTop++];
        stack[stackTop]->todo = todoItem;
    }
}
void TodoStackArray::pop()
{
    if(stackTop == -1)
    {
        cout<<"Stack empty, cannot pop an item."<<endl;
    }
    else
    {
        stackTop--;
    }
}

同样,要明确的是,我们没有提供驱动软件。他们将从他们自己的东西进行评估,所以我们必须编写自己的驱动软件来测试我们的功能。因此没有任何Main实现。

是的,TodoStackArray::TodoStackArray()确实是你的类的默认构造函数。

你应该对它做什么,就像对任何默认构造函数一样:

如果我创建一个新的TodoStackArray,类成员应该如何初始化 ?

答案取决于你的类在初始状态下应该是什么样子。

在您的情况下,"默认情况下"堆栈为空。将stackTop设置为-1并不是一个坏主意,并且您的实现的其余部分与此一致(stackTop == -1显然意味着"空堆栈")。

在构造函数中发生的奇怪的事情是:
stack[stackTop];

你认为这句话的目的是什么?读取数组中的值是负下标,我们都知道这种事情不会有好结果。

构造函数是用来初始化数据的。这里你正在读取一些你没有初始化的东西在一个不存在的索引处。这没什么意义,不是吗?:)

删掉这一行,你就能继续写下去了。下面是使用成员初始化列表(被认为更好)的等效实现:

TodoStackArray::TodoStackArray() : stackTop(-1)
{
    // notice: no body required here
}

玩得开心!