Рекурсивные обходы C ++ с указателями на функции - PullRequest
1 голос
/ 16 октября 2008
template <class T>
void BT<T>::inOrder(void (*inOrderPtr)(T&))
 {
     inOrderPtr(inOrder(this->root));
 }
template <class T>
void BT<T>::inOrder(Node<T>* root) const
 {
    if (root->left != NULL)
       inOrder(root->left);
       //something here
    if (root->right != NULL)
       inOrder(root->right);
 }

Хорошо, я пытаюсь создать этот обход через рекурсию. Я на самом деле опубликовал эту проблему раньше, но я ошибался из-за необходимости использовать указатель на функцию. Я не понимаю, что я должен делать. У меня есть общедоступная оболочка, которая вызывает приватную ... но общедоступная - это та, в которой передается функция, так что мне с ней делать? Я чувствую себя отсталым, поэтому даже если бы кто-то дал мне небольшой намек, я уверен, что получу это. Я просто не знаю, куда идти отсюда.

Пример кода, который вызывает его, таков:

first.inOrder(print_val)

1 Ответ

4 голосов
/ 16 октября 2008

Вот как это сделать правильно, но Node :: GetItem нуждается в реализации, чтобы это было на 100% правильно:

template <class T>
T& Node<T>::GetItem() const
 {
    // TODO - implement getting a T& from a Node<T>
    return m_item; // possible implementation depending on Node's definition
 }

template <class T>
void BT<T>::inOrder(void (*inOrderPtr)(T&))
 {
    inOrder(this->root, inOrderPtr);
 }

template <class T>
void BT<T>::inOrder(Node<T>* root, void (*inOrderPtr)(T&)) const
 {
    if (root->left != NULL)
       inOrder(root->left, inOrderPtr);

    inOrderPtr(root->GetItem());

    if (root->right != NULL)
       inOrder(root->right, inOrderPtr);
 }
...