C ++ - 重载没有cin或cout的流操作符

时间:2018-04-03 13:24:00

标签: c++ io stream operator-overloading

我的任务是重载运算符<<和>>在Stack类中,它们可以从Stack中添加或提取元素。例如:

stack << 1 << 2 << 3;
stack >> a >> b >> c;     // a==3, b==2, c==1

我尝试以这种方式完成任务,但解决方案似乎不正确:

std::ostream & operator<<(Stack lstack, const double &value)
{
  lstack.push(value);
  return lstack;
}

有人能给我一些提示吗?

修改

好吧,所以我不相信我对这种返回类型犯了这么愚蠢的错误。然而,经过一些修改后,我的程序无法编译。以下是代码段:

int main()
{
   Stack stos;
   std::cout << "***STACK***" << std::endl;
   stos.push(2); stos.push(5); stos.push(3);
   stos << 7;
   ...
}

//Stack.h
 #pragma once
 #include <iostream>
 class Stack
 {
   public:
    Stack();
    Stack(const Stack &);
   ~Stack();

    struct Element;
    virtual void push(double);
    virtual double  pop();
    virtual int empty();
    int sizeIt();
    int sizeRec();
    int countRec(Element*);

    Stack& operator=(const Stack&);
    Stack& operator<<(Stack&, const double);

  protected:
   struct Element
   {
      double value;
      Element *prev;
   };
   Element *top;
};   

//stack.cpp
   Stack& operator<<(Stack& lstack, const double value)
   {
     lstack.push(value);
     return lstack;
   }

   void Stack::push(double e)   
   {
      Element *newElem = new Element;
      newElem->value = e;
      newElem->prev = top;
      top = newElem;
   }

现在,在头文件中,我的错误是E0344:“此运算符函数的参数太多”和主C2679:'找不到运算符,它采用“int”类型的右侧操作数。

1 个答案:

答案 0 :(得分:3)

两个问题:

  • 您的代码采用Stack副本,破坏了嵌套
  • 您的代码尝试返回ostream&,好像它是Stack一样,打破了编译(好吧,也许;您认为我们不值得看到它的定义)

我猜您打算写下以下内容:

Stack& operator<<(Stack& lstack, const double value)
{
    lstack.push(value);
    return lstack;
}