2016-10-20 6 views
-3

В принципе, у меня возникают проблемы как с файлом заголовка, так и с файлом cpp с функцией поиска. Он просто говорит: «Объявление участника не найдено» и «прототип для» узла * BTree :: search (int) не соответствует ни одному классу BTree ». Я только перечислил функции поиска в файле cpp, чтобы сделать это проще, потому что мои функции insert и destroy_tree работают нормально.Реализация двоичного дерева поиска. Проблемы с компиляцией

Заголовочный файл:

#ifndef BTREE_H_ 
#define BTREE_H_ 

class BTree { 


public: 
struct node{ 

int key_value; 
node *left; 
node *right; 
}; 

BTree(); 
virtual ~BTree(); 

void insert(int key); 
node* search(int key); 
void destroy_tree(); 
node *root; 


private: 

void insert(int key, node *leaf); 
node* search(int key, node *leaf); 
void destroy_tree(node *leaf); 



}; 

#endif /* BTREE_H_ */ 

Реализация:

#include "BTree.h" 
#include <iostream> 
using namespace std; 
struct node{ 

      int key_value; 
      node *left; 
      node *right; 
     }; 

BTree::BTree() { 

root = NULL; 
} 

BTree::~BTree() { 

destroy_tree(); 
} 

node BTree::*search(int key, node *leaf){ 

if(leaf != NULL){ 

    if(key == leaf->key_value){ 

     return leaf; 
    } 
    if(key < leaf->key_value){ 

     return search(key, leaf->left); 
    } 

    else{ 

     return search(key, leaf->right); 
    } 
} 
else return NULL; 
} 


node *BTree::search(int key){ 

return search(key, root); 
} 
+0

Я пробовал это, но я получаю сообщение об ошибке, которое говорит, что он не может преобразовать узел * в узел :: BTree :: *, когда он возвращает лист. –

ответ

0

У вас есть два struct node структур, заявленную во всем мире (в файле .cpp) и один объявленный в BTree классе. Это две разные структуры: одна - ::node (глобальная), другая - BTree::node. В вашем файле заголовка search ссылается на значение, определенное в классе, в то время как объявление функции в файле .cpp относится к глобальному.

Удалить глобальную структуру и вместо этого объявить функцию поиска, используя BTree::node *BTree::search.

+0

Это исправлено! Почему мне нужно объявить его в пределах объема Бриф дважды, как описано? –

+0

Это связано с тем, как ищут имена. Когда объявлен тип возврата, компилятор не будет смотреть в пределах BTree, если вы не сообщите об этом. Как только вы попадете в область BTree (когда имя функции будет разобрано), компилятор будет искать внутри этого класса для имен. – 1201ProgramAlarm

Смежные вопросы