我真的不确定如何调用该函数:
friend ostream& operator<<(ostream& out, stack::myItem& theItem);
对我的堆栈对象公开:
class stack
{
public:
stack(int capacity);
~stack(void);
void method1();
...
private:
struct myItem
{
int item;
};
...
public:
friend ostream& operator<<(ostream& out, stack& s);
friend ostream& operator<<(ostream& out, stack::myItem& theItem);
};
答案 0 :(得分:3)
与使用流操作符&lt;&lt;无异。对于任何其他类型(由于某种原因,它被称为operator 重载)。
但是,输出不应该修改对象,因此你真的应该通过const引用传递它(否则使用temporaries的调用将无法编译)。
friend ostream& operator<<(ostream& out, const stack& s);
friend ostream& operator<<(ostream& out, const stack::myItem& theItem);
答案 1 :(得分:3)
此运算符是经典的二元运算符。
// Say I have an operator declared like this:
return_type operator@(left_type lhs, right_type rhs);
// Then the invocation is done this way:
left_type L;
right_type R;
return_type result = L @ R;
在流操作符的情况下,它有点特殊,因为左手参数和返回类型实际上具有相同的类型(实际上,将引用相同的对象,尽管在不同的时间)。这样做是为了允许链接。
// Chaining
std::cout << "<Output> " << 1 << std::endl;
// Which can be analyzed like such
operator<<(
operator<<(
operator<<(
std::cout ,
"<Output> "
),
1
),
std::endl
);
如您所见,语法只允许方便的调用。有人可能会注意到订单定义非常明确,这是一个严格的从左到右的评估。
因此,对于您的对象,它将成为:
stack s;
std::cout << s << std::endl;
就像那样!
答案 2 :(得分:1)
从哪里打电话?因为它的编码只有类知道私有结构。类外部的代码都不能使用该方法,因为它无法创建结构的实例。将它标记为朋友对你没有多大好处。