我正在尝试重载<<运算符使用代码
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 *我不知道这是否与它有任何关系。
感谢您的帮助。
答案 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);
我希望这有帮助!