使用头文件中的 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
}
玩得开心!
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
}
玩得开心!