流<<运算符过载

Overload ostream << operator

本文关键字:lt 运算符      更新时间:2023-10-16

我想知道是否有可能在需要以两种特定方式打印类中的对象时重载<< operator

例如,我正在构建一个多米诺骨牌游戏,所以我需要打印带有数字的多维数据集:[1][6][6][3]并打印计算机立方体:[ ][ ]

这里有一个重载提取和插入运算符的例子:

/*
    Operator: <<
    This insertion operator outputs the data members of 
    class object instantiation in the format:(x,y)
    The returning type ostream&, allows 
    you to chain more then one objects to be printed.
*/
ostream& operator<< (ostream& os, class_name& object_name) {
   return os << '(' << object_name.get_data_memberx() 
             << ',' << object_name.get_data_membery()
             << ')';
}
/*
    Operator: >>
    This extraction operator creates an input stream it
    inserts to it values for of all the data members of
    the class passed by reference and returns it.
    Input format: (x,y)
*/
istream& operator>> (istream& is, class_name& object_name) {
     char par1, comma, par2;
     double x, y;
     is >> par1 >> x >> comma >> y >> par2;
     // check if any input
     if(!is) return is;
     // check for valid input format
     if (par1 != '(' || comma != ',' || par2 != ')') {
         // set failbit to indicate invalid input format
         is.clear(ios_base::failbit);
         return is;
     }
     // assign input values to second argument
     object_name = class_name(x,y);
     return is;
}

您可以使用上面的示例并修改格式以匹配所需的结果。

虽然其他人已经回答了如何重载operator<<,但还不清楚如何使用两种不同的格式。我建议这样做:临时对象。

struct showdomino {
    domino& d; 
};
std::ostream& operator<<(std::ostream& out, showdomino dom) 
{return out << '[' << dom->d.number << ']';}
struct hidedomino {};
std::ostream& operator<<(std::ostream& out, hidedomino dom) 
{return out << "[ ]";}

然后用法大致如下:

if (show_it)
    std::cout << showdomino{d} << 'n';
else
    std::cout << hidedomino{} << 'n';

<用于cout的运算符实际上是被重载以获得这种行为的逐位左移位运算符。

我真的不明白你到底想要实现什么(一个代码片段会很有帮助)。但是,你似乎想让<lt;用于ostream和YourClass类型。你可以有这样的东西:

void operator<<(ostream str, YourClass cls) {
    // generate required output
}

请注意,这是一个常规函数,只是调用语法不同。