C ++用作参数Binary Search

时间:2018-11-06 17:44:00

标签: c++

我是堆栈溢出的新手,在已经提出的问题中找不到合适的答案。

我想做的是将一个函数作为参数传递给另一个函数(二进制搜索树,有序遍历)。

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);
    }
}

任何帮助将不胜感激!

1 个答案:

答案 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方法...)