【问题标题】:overloading == for a stack class using vectors使用向量为堆栈类重载 ==
【发布时间】:2016-06-17 13:11:26
【问题描述】:
template <typename T>
bool operator==(const Stack<T>& a, const Stack<T>& b)

我必须使用 STL 实现堆栈 adt(我选择了向量)

我无法重载这个非成员全局函数。我在私有部分中有一个向量,我想通过弹出并检查顶部以查看它们是否相等来比较每个元素,但是,我不能这样做,因为堆栈是 const。有人可以引导我走向正确的方向吗?

【问题讨论】:

  • 不要poppeek.
  • 必须是全局函数吗?如果没有,只需实现成员函数并手动检查元素而不弹出任何内容?
  • 也可以将函数声明为Stackfriend,然后直接比较vectors
  • 它必须是一个全局函数,并且 peek 不是我需要定义的成员函数之一
  • 以破坏正在比较的对象的方式实现== 有点,容我们说,不友好== 通常采用 const 操作数并非偶然。

标签: c++ vector stack overloading operator-keyword


【解决方案1】:

您为什么不在std::vector 数据对象上使用operator==?您只需要一个friend 声明:

template<typename T> class Stack {
  /* The following allows operator== to use private members */
  friend bool operator==(const Stack&, const Stack&);
  public: /* ... */
  private:
    std::vector<T> data_;
};

template<typename T>
bool operator==(const Stack& a, const Stack& b) {
  return a.data_ == b.data_;
}

【讨论】:

  • 或者你可以将operator==定义为成员函数。当你这样做时会有一些奇怪的事情(我永远记不起细节),但你也可以将一些其他方法名称定义为成员函数,然后从非成员 operator== 调用它。使用friend 并没有错,当然,只是列出替代方案。
  • @Steve314:OP 包含了所需的原型,这显然是一个非成员函数。而非成员函数是一个更好的解决方案,这大概就是教授建议那个原型的原因。 (在stackoverflow.com/questions/4622330/… 讨论;可能还有其他人。)
  • OP 没有明确说明教授提供了该原型,尽管这可能是暗示的。即便如此,我只声称有其他选择。学习 C++ 并不仅仅意味着让你的老师开心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2020-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
相关资源
最近更新 更多