C++ 超载<&书信电报;运营商作为一个;“朋友”;用于打印BST-C++;
我试图重载C++ 超载<&书信电报;运营商作为一个;“朋友”;用于打印BST-C++;,c++,operator-overloading,binary-search-tree,C++,Operator Overloading,Binary Search Tree,我试图重载,而不是 ostream& operator<<(ostream &out, const WordTree& rhs) { out << InOrder(&out, rhs.root); return out; } 而不是 ostream& operator<<(ostream &out, const WordTree& rhs) { out << InOr
,而不是
ostream& operator<<(ostream &out, const WordTree& rhs)
{
out << InOrder(&out, rhs.root);
return out;
}
而不是
ostream& operator<<(ostream &out, const WordTree& rhs)
{
out << InOrder(&out, rhs.root);
return out;
}
我可以用什么方法解决这个问题
这可能有点高级,但您提出了这个问题,下面是一个解决问题的可能方法:
inoorder
可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用
这尚未编译,但向您展示了顺序遍历的可能通用实现是什么样子,以及如何使用操作符m_数据打印每个节点;计数+=cur->m_计数});
//..
标准::cout
我可以用什么方法解决这个问题
这可能有点高级,但您提出了这个问题,下面是一个解决问题的可能方法:
inoorder
可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用
这尚未编译,但向您展示了顺序遍历的可能通用实现是什么样子,以及如何使用操作符m_数据打印每个节点;计数+=cur->m_计数});
//..
这不管用。我得到以下错误:对象的类型限定符与成员函数“WordTree:inoorder”不兼容。对象类型是:const WordTree
@aelarabi,这很不幸inoorder
应该是const
成员函数。这不起作用。我得到以下错误:对象的类型限定符与成员函数“WordTree:inoorder”不兼容。对象类型是:const WordTree
@aelarabi,这很不幸inoorder
应该是一个const
成员函数。inoorder可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用。InOrder可以是一个通用的顺序遍历函数,无论您想对所访问的节点执行什么操作,都可以将该节点传递给用户定义的函数。这将使您的遍历更加通用和有用。
ostream& operator<<(ostream &out, const WordTree& rhs)
{
out << InOrder(&out, rhs.root);
return out;
}
ostream& operator<<(ostream &out, const WordTree& rhs)
{
// Invoke InOrder on the WordTree object.
// Use just out, not &out.
return rhs.InOrder(out, rhs.root);
}
ostream& operator<<(ostream &out, const WordTree& rhs)
{
// Invoke InOrder on the WordTree object.
// Use just out, not &out.
WordTree temp(rhs);
return temp.InOrder(out, temp.root);
}
class WordTree
{
//...
public:
// generic, templated inorder traversal function
template <typename fn>
void InOrder(WordNode *cur, fn predicate)
{
if ( !cur )
return;
InOrder(cur->m_left, predicate);
// call the user-defined function
predicate(cur);
InOrder(cur->m_right, predicate);
}
friend std::ostream& operator<<(std::ostream &out, const WordTree& rhs);
//...
};
// A helper functor to print one node
struct NodePrinter
{
std::ostream* strm;
// Initialize object with pointer to the stream
NodePrinter(std::ostream* s) : strm(s) {}
// function that is called by InOrder
void operator()(WordNode *cur)
{
*strm << cur->m_data << " " << cur->m_count << "\n";
}
};
std::ostream& operator<<(std::ostream &out, const WordTree& rhs)
{
// create instance of the functor
NodePrinter np(&out);
// call the InOrder function (assume that get_root() returns the pointer to the root node)
rhs.InOrder(rhs.get_root(), np);
return out;
}
std::string allNodes;
int count = 0;
//...
rhs.InOrder(rhs.get_root(), [&](WordNode *cur) { allNodes += cur->m_data; count += cur->m_count });
//..
std::cout << allNodes << "\n" << count;