【问题标题】:Implement template class Stack实现模板类 Stack
【发布时间】:2020-09-08 23:29:05
【问题描述】:

使用模板类 List 实现类堆栈时出现一些错误。

#include <iostream>
#include <stdexcept>

template<class T>
class Stack
{
private:
List<T> fElements;

public:

typedef typename List<T>::Iterator Iterator;

bool isEmpty() const;
int size() const;
void push( const T& aItem );
void pop();
const T& top() const;

const T& operator[]( size_t aIndex ) const;

// stack iterators
Iterator begin() const;
Iterator end() const;
Iterator rbegin() const;
Iterator rend() const;
};

使用 Stack 类获取实现的问题。使用迭代器

【问题讨论】:

  • 请在问题中包含minimal reproducible example 和错误消息
  • 你还没有定义Iterator类型。
  • 提供一个通过引用返回元素的top() 方法是危险的,因为在调用pop() 后最上面的元素可能会变得无效。很可能有人使用top() 获取最顶层的元素,然后使用pop() 删除该元素。如果 pop() 被监督,然后该元素被访问,它会导致未定义的行为。

标签: c++ list templates stack


【解决方案1】:

你只需要包含列表头,使用小写list而不是大写List以及指定命名空间std:

#include <iostream>
#include <stdexcept>
#include <list>

template<class T>
class Stack
{
private:
    std::list<T> fElements;

public:

    typedef typename std::list<T>::Iterator Iterator;

    bool isEmpty() const;
    int size() const;
    void push( const T& aItem );
    void pop();
    const T top() const;

    const T &operator[]( size_t aIndex ) const;

    // stack iterators
    Iterator begin() const;
    Iterator end() const;
    Iterator rbegin() const;
    Iterator rend() const;
};

【讨论】:

  • 我不想在答案中包含我的意见。因此我将其添加为注释:您应该让pop 方法返回堆栈的最顶部元素(当然是通过副本)以与top 方法保持一致。这比需要一直使用top()pop() 更方便。
【解决方案2】:

您应该包含list 标头,并且c++ 是一种区分大小写的编程语言,因此,根据标准声明您的数据类型(此为抽象)并指定std 命名空间非常重要。

    #include <iostream>
    #include <stdexcept>
    #include <list>

    template<class T>
    class Stack
    {
    private:
    std::list<T> fElements;

    public:

    typedef typename std::list<T>::Iterator Iterator;

    bool isEmpty() const;
    int size() const;
    void push( const T& aItem );
    void pop();
    const T& top() const;

    const T& operator[]( size_t aIndex ) const;

    // stack iterators
    Iterator begin() const;
    Iterator end() const;
    Iterator rbegin() const;
    Iterator rend() const;
    };

【讨论】:

  • 实现给定的堆栈方法。在 const T& operator[] (size_t aIndex) const; 期间出现错误
  • 未显示重载运算符 (const T &amp; operator [] (size_t aIndex) const;) 的实现,如果可以,请提供一个最小可重复的块示例(您已定义最后一个)和完整的叶轮通过你的编译器(暴露完整的错误),我看不到你的错误在哪里,什么是错误,因为这里只有你的方法的原型。
  • 除此之外,在我看来,原型的实现和类的主体似乎是正确的,现在它取决于代码的其他块。
猜你喜欢
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多