如何重载<<操作者

时间:2017-04-20 21:54:55

标签: c++ printing overloading

我正在尝试重载<<运算符使用代码

inline ostream& operator<< (ostream& out, Node& n){n.print(out); return out;}

我打电话的打印功能只是

void Node::print(ostream& out){
    out<< freq << "  " << input<<"  " << Left<< "  " << Right<< endl;
}

当我调用print函数时,左和右都是以十六进制打印的指针。但是当我使用&lt;&lt;运算符它只是以十六进制打印,即0x600084d40。我不希望它以十六进制打印我想要当我打印时我想要freq和输入的值以及两个十六进制指针。

当我尝试将其打印出来时,我正在打印一个Node *我不知道这是否与它有任何关系。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

  

当我尝试将其打印出来时,我正在打印一个Node *我不知道这是否与它有任何关系。

肯定会。

Node* n = ...;
std::cout << n;

调用只打印指针的重载。你需要使用:

Node* n = ...;
std::cout << *n;

如果你想要

std::cout << n;

类似的工作
std::cout << *n;

你必须提供过载。

inline ostream& operator<< (ostream& out, Node* n)
{
   return (out << *n);
}

建议的改进

operator<<函数应该使用const&,而不是非const引用。

inline ostream& operator<<(ostream& out, Node const& n);

这需要将print更改为const - 成员函数。

我还建议将print的返回类型更改为std::ostream&

std::ostream& print(std::ostream& out) const;

现在,实现看起来像:

std::ostream& Node::print(std::ostream& out)
{
    return (out<< freq << "  " << input<<"  " << Left<< "  " << Right<< std::endl);
}

inline std::ostream& operator<<(std::ostream& out, Node const& n)
{
   return n.print(out);
}

inline std::ostream& operator<<(std::ostream& out, Node const* n)
{
   return (out << *n);
}

答案 1 :(得分:0)

为什么要使用打印功能?相反,你可以使用友元函数重载。以前在实现时我需要通过const引用传递对象,如const Node &name,并返回ostream&

假设freq和input是该类的成员,您的代码在.cpp中应如下所示:

ostream& operator<<(ostream& out,  const Node& n)
{
   return out<<n.freq<< "  " <<n.input<<"  "<<n.Left<<"  "<< n.Right;
}

这是在.h:

friend ostream& operator<<(ostream& out, const Node& n);

如果这需要指针,您只需将其修改为:

ostream& operator<<(ostream& out,  const Node* n)
{
   return out<<n->freq<< "  " <<n->input<<"  "<<n->Left<<"  "<< n->Right;
}

friend ostream& operator<<(ostream& out, const Node* n);

我希望这有帮助!