运算符<<枚举类型是否使用重载运算符?

时间:2017-10-25 05:00:16

标签: c++ enums operator-overloading

我希望这次我的问题能够更好地制定和格式化。 这是代码,当我认为它不应该产生两个单独的输出,因为我每次使用(我认为)重载运算符<<对于枚举类型。

#include <iostream>
using namespace std;

enum Etat { Intact = 5 };

class Ship {

public: 
Etat etat_;  

Ship ( Etat t = Intact) : etat_(t) {}
~ Ship() {} 

ostream& description ( ) const {  return cout <<  "Etat: " << etat_ << "   ---   ";} 
//---------------------------------------ˆˆˆˆ----
};

ostream& operator<< ( ostream& s, const Etat& etat_ ) 
{
  switch  ( etat_ )
    {
      case Intact:    s << "intact";   break;
      default:        s << "unknown state";
    }
  return s;
}

ostream& operator<< ( ostream& s, Ship n )  {  return s <<  "Etat: "  <<  n.etat_ ; }

int main()
{
  Etat etat_ = Intact;   
  cout << endl << endl << "Etat: " 
       << etat_ << "       \"cout << etat_\"" << endl << endl;

  cout << Ship(etat_) 
       << "       \"cout << Ship(etat_)\"" << endl << endl;

  cout << Ship(etat_).description() 
       << "  \"cout << Ship(etat_).description()\"" << endl << endl;

  return 0;
}

这是我在终端上得到的:

Etat: intact       "cout << etat_"

Etat: intact       "cout << Ship(etat_)"

Etat: 5   ---   1  "cout << Ship(etat_).description()"

任何人都可以向我解释为什么,在最后一种情况下,它不仅需要enum attribut的整数值,还会在测试字符串“---”之后添加“1”???

我唯一能想到的是因为我在description()中使用了非正统的返回方法,即'return cout&lt;&lt; ..“,但它似乎有效,因为测试字符串出现了。

有没有办法强制使用运营商&lt;&lt; description()中的重载?

由于

1 个答案:

答案 0 :(得分:0)

在description()函数中,您将返回对std :: cout的引用,并在main函数的std :: cout调用中使用它。运营商&lt;&lt;&lt;&lt;&lt;&lt;作为第一个参数采用ostream参考。你应该像这样修改你的功能,一切都应该有效:

ostream& description(ostream& os) const {  
    return os <<  "Etat: " << etat_ << "   ---   ";
}

打印出来的随机“1”可能是由于您的示例中的ostream试图打印出对自身的引用。