【发布时间】:2015-04-21 18:08:34
【问题描述】:
我搜索了类似的问题,但找不到适合我情况的问题。我有一个使用数组类作为数据成员的堆栈类。我在大小为 5 的堆栈(在本例中为数据成员 'Array m_array')上的“main()”中使用 push 和 pop 对其进行测试。我使用 for 循环用后缀增量填充堆栈,但不是将 0 推入第一个元素,而是推入 1。我的输出是:
1
2
3
4
3
2
1
0
-1
Stack is full(empty)
但我希望它是
0
1
2
3...
测试中:
int main()
{
try {
Stack<int> s(5);
for (int i = 0; i < 4; i++) {
s.Push(i);
cout << s << endl;
}
cout << endl;
for (int i = 0; i < 8; ++i) {
s.Pop();
cout << s << endl;
}
}
catch (ArrayException &ex) //catch object
{
cout << ex.GetMessage() << endl;
}
catch(...) //default catch
{
cout << "An unhandled exception has occurred" << endl;
}
return 0;
}
在stack.cpp中:
#ifndef STACK_CPP
#define STACK_CPP
#include "stack.h"
namespace Jules
{
namespace Containers
{
template<typename T> //default constructor
Stack<T>::Stack() : m_array(Array<T>()), m_current(0)
{
}
template<typename T> //destructor
Stack<T>::~Stack()
{
}
template<typename T> //copy constructor
Stack<T>::Stack(const Stack<T> &s) : m_array(s.m_array), m_current(s.m_current)
{
}
template<typename T> //constructor with input argument
Stack<T>::Stack(const int i) : m_array(i), m_current(0)
{
}
template<typename T> //assignment operator
Stack<T> Stack<T>::operator=(Stack<T> const &source)
{
if (this == &source)
return *this;
Stack<T>::operator = (source);
return *this;
}
template<typename T> //push function
void Stack<T>::Push(const T& element)
{
m_array[m_current] = element;
++m_current;
}
template<typename T> //pop function
void Stack<T>::Pop()
{
--m_current;
m_array[m_current];
}
template<typename T2> //send to ostream
ostream& operator << (ostream& os, const Stack<T2>& t)
{
os << t.m_current;
return os;
}
}
}
#endif
【问题讨论】:
-
'operator &)' 是做什么的?
-
它是 ostream 运算符,所以我可以计算堆栈
对象。 -
“它推 1”。你怎么知道?您不是在打印推送的内容,而是在打印堆栈本身,并且打印堆栈的代码不可用。
-
在
Stack<T>::Pop()中,您的第一行是m_array[m_current];。这实际上没有任何作用(除了读取超出数组的范围,但这是另一回事)。您是要返回弹出的元素吗?我个人会将您的推送方法重写为:m_array[m_current++] = element; if(m_current > size) enlarge();,并将您的弹出方法重写为if(m_current == 0) throw SomeException(); return m_array[--m_current]; -
另外,也许您打算实现队列而不是堆栈?当您将 1、2、3 压入堆栈然后弹出所有值时,您将得到 3、2、1。对于队列,压入 1、2、3 然后弹出将给您 1、2、3。跨度>
标签: c++ stack composition delegation