【问题标题】:C++ postfix incrementation in a for loop; stacks; composition/delegationfor 循环中的 C++ 后缀递增;堆栈;组成/代表团
【发布时间】: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&lt;T&gt;::Pop() 中,您的第一行是m_array[m_current];。这实际上没有任何作用(除了读取超出数组的范围,但这是另一回事)。您是要返回弹出的元素吗?我个人会将您的推送方法重写为:m_array[m_current++] = element; if(m_current &gt; 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


【解决方案1】:

operator &lt;&lt; 的代码只是打印堆栈的大小。所以你没有看到任何堆栈值被打印出来,只是大小。您很不幸,堆栈的大小与您向其推送的值密切相关。

您希望operator &lt;&lt; 做什么?也许它应该遍历堆栈内容并将它们全部打印出来?也许它应该只是在堆栈大小之前说“堆栈大小:”,那么它就会很明显。

【讨论】:

  • 据我所知,这是一个完美的关联,它在我的循环中不断推进和弹出。我不明白这里有什么问题。我原来的帖子没有提到 ostream 运营商,我不明白你为什么提出这个问题?谢谢
  • 你说输出不正确。使用此行cout &lt;&lt; s &lt;&lt; endl; 完成输出。该行调用您的 operator &lt;&lt; 方法。您的 operator &lt;&lt; 方法打印堆栈的大小。所以目前你的代码将一个值压入堆栈并打印堆栈的大小。
猜你喜欢
  • 2014-08-11
  • 1970-01-01
  • 2020-08-10
  • 2012-03-16
  • 2021-12-27
  • 2018-07-15
  • 1970-01-01
  • 2022-01-15
  • 2014-05-15
相关资源
最近更新 更多