2015-04-03 161 views
2

我想知道是否有可能过载<< operator需要以两种方式在类中打印对象。Overload ostream <<运算符

例如,我建立一个多米诺骨牌的游戏,所以我需要打印我的立方体与数字:[1][6][6][3] 和打印电脑多维数据集:[ ][ ]

+0

IIRC,它*的*重载...所以你想做什么就很有可能=) – Mints97 2015-04-03 19:37:32

+0

标准使用[流操纵]( http://en.cppreference.com/w/cpp/io/manip)以各种方式打印相同的数据。 – 2015-04-03 19:40:32

+0

哈哈我试图想办法,因为我不知道该怎么改变函数的参数,因为它们几乎相同,只有执行不同:( – imthaking 2015-04-03 19:40:49

回答

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; 
} 

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

+3

这将是一个*插入操作符*。此外,我不认为这回答了如何以两种方式打印对象: – 2015-04-03 19:43:36

+1

该操作符将对象“插入”到ostream中。提取操作符通常用于'cin' – Carcigenicate 2015-04-03 19:50:16

+0

@Drew Dormann感谢修正。 – Ziezi 2015-04-03 19:50:27

0

< <用于cout的运算符实际上是重载的位运算符,用于获取此行为。

我真的不明白你想要达到什么目的(代码段会有帮助)。但是,似乎您想要为ostream和YourClass类型重载< <。你可以有这样的东西:

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

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

+1

它应该返回'ostream&'不是void – 2015-04-03 19:47:23

+0

但是如果我想另外添加另一个以不同方式打印的重载,那该怎么办呢?例如:X = Y = – imthaking 2015-04-03 19:47:46

+0

然后,您返回一个ostream和对该ostream的引用,如@Alejandro Diaz建议。请注意,我的代码段比您实际需要的指导更多 – Paul92 2015-04-03 19:50:21

2

虽然其他人已经回答了如何重载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'; 
+0

该行是什么:if(show_it)呢? – imthaking 2015-04-03 20:06:20

+1

这是...成为我所有代码中最直接的一行。它只是一个if语句,作为任何_your_代码的占位符。 – 2015-04-03 20:08:39

+0

Ohhhh好的谢谢! – imthaking 2015-04-03 20:10:49