我是堆栈溢出的新手,在已经提出的问题中找不到合适的答案。
我想做的是将一个函数作为参数传递给另一个函数(二进制搜索树,有序遍历)。
template <class elemType>
void bSearchTreeType<elemType>::createList(orderedLinkedList<elemType>& listIn)
{
this->inorderTraversal(listIn.insert);
}
这应该做的是对二进制树进行有序遍历,并将每个元素插入orderedLinkedList。通过ListIn.insert()时,我似乎无法使其正常工作。
我可以使命令与传递给它的其他功能一起使用。像这样传递给inorder时,此函数有效:inOrderTraversal(update)
template <class elemType>
void update(elemType& x)
{
x = 2 * x;
};
这是顺序遍历的定义:
template <class elemType>
void binaryTreeType<elemType>::inorder(binNodeType<elemType>* p, void(*visit) (elemType& item)) const
{
if (p != nullptr)
{
inorder(p->lLink, *visit);
(*visit)(p->info);
inorder(p->rLink, *visit);
}
}
任何帮助将不胜感激!
答案 0 :(得分:1)
insert
方法实际上不是单参数c函数,c ++方法具有一个隐藏的第一个参数,该参数作为this
的值传递,在这种情况下,该参数应为{ {1}}。
实现此方案的c ++方法将对访问回调使用类似std :: function的内容,请参见https://en.cppreference.com/w/cpp/utility/functional/function上的一些示例。
而不是函数指针,您将传递具有listIn
运算符的对象。对象可以包含所需的内部状态。
传统的类似于c的方法是带状态的回调,()
是一个像visit
这样的两个参数的函数,并且inorder会接受一个额外的visit(void * cbData, elemType& item)
参数,它不会碰,只会传递给void * cbData
个呼叫。 (然后被调用的函数可以将cbData强制转换为列表并调用其insert方法...)