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--;
}
}
另外,要明确的是,我们没有提供驱动程序软件。他们将从他们自己的东西评估,所以我们必须编写自己的驱动程序软件来测试我们的功能。因此缺乏任何主要实施。
答案 0 :(得分:1)
是的,TodoStackArray::TodoStackArray()
确实是您的类'默认构造函数。
你应该怎么做,就像任何默认构造函数一样:
如果我创建新的
TodoStackArray
,该类成员应如何初始化?
答案取决于你的班级在初始状态下应该是什么样子。
在您的情况下,“默认情况下”堆栈为空。将stackTop
设置为-1并不是一个坏主意,其余的实现与此一致(stackTop == -1
显然意味着“空堆栈”)。
构造函数中发生的奇怪之处是:
stack[stackTop];
根据你的说法,这条线的目的是什么?你在负数索引中读取数组中的值,我们都知道这种事情永远不会结束。
构造函数用于初始化数据。在这里,您正在阅读未在不存在的索引处初始化的内容。没有多大意义,是吗? :)
摆脱这条线,你应该能够继续前进。这是使用member initializer list的等效实现(被认为更好):
TodoStackArray::TodoStackArray() : stackTop(-1)
{
// notice: no body required here
}
玩得开心!