使用头文件中的 class 变量的误解

Misunderstanding in use of class variables from a header file

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];  
};  

上面是一些声明和来自当前分配的头文件的 class。我们的任务是使用这个头文件来实现一个堆栈程序。但是,我对头文件中 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() 确实是您的 class' 默认构造函数。

您应该像使用任何默认构造函数一样使用它做什么:

How are the class members supposed to be initialized if I create a new TodoStackArray?

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

在你的情况下,"by default" 堆栈是 。将 stackTop 设置为 -1 不是一个坏主意,您的其余实现与此一致(stackTop == -1 显然意味着 "empty stack")。

构造函数中发生的奇怪事情是:

stack[stackTop];

您认为此行的目的是什么?您正在 读取 数组中的负索引值,我们都知道这种事情永远不会有好下场。

构造函数用于初始化您的数据。在这里,您正在阅读您未在不存在的索引处初始化的内容。没有多大意义,是吗? :)

只要去掉这条线,你就可以继续前进了。这是使用 member initializer list 的等效实现(被认为更好):

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

玩得开心!