Объявление метода структуры в C ++ - PullRequest
0 голосов
/ 17 октября 2010

Я пытаюсь создать повторяющийся метод struct в моем коде, чтобы пройти через двоичное дерево поиска. Но я получаю ошибки при компиляции и не знаю, в чем причина.

У меня есть Node* findNode(const Node *, const Object &); в приватном разделе .h файла

и

Node* BSTree::findNode(const Node* current, const Object &target){
if(*current->item == target)
    return current;

Node* temp = NULL;

if(current->nodeLeft != NULL){
    temp = findNode(current->nodeLeft, target);

    if(temp != NULL)
        return temp;
}

if(current->nodeRight != NULL){
    temp = findNode(current->nodeRight, target);

    if(temp != NULL)
        return temp;
}
return NULL;

}

в ср.

Я генерирую следующие ошибки:

- ошибка C2143: синтаксическая ошибка: отсутствует ';' до '*'
Ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int
Ошибка C4430: отсутствует указатель типа - предполагается int. Примечание: C ++ не поддерживает default-int
ошибка C2556: 'int * BSTree :: findNode (const BSTree :: Node *, const Object &)': перегруженная функция отличается только типом возврата от 'BSTree :: Node * BSTree :: findNode (const BSTree :: Node * , const Object &) '

Все ошибки компилятора указывают на первую строку кода в cpp. Я попытался найти коды ошибок, но не нашел ничего, что ответило бы на мой вопрос относительно причины.

Что является причиной ошибок и почему мой компилятор читает его в 'int BSTree', а не в Node * BSTree? Я делаю синтаксическую ошибку или забываю включить? На данный момент я просто включил iostream и fstream.

Заранее благодарю всех, кто нашел время, чтобы прочитать это.

Редактировать:

Чтобы ответить на вопрос Колина.

У меня есть #include "BSTree.h" в моем .cpp

И в .h у меня есть:

 #ifndef BSTREE_H  
 #define BSTREE_H  

 #include <iostream>  
 #include <fstream>  

Ответы [ 2 ]

3 голосов
/ 17 октября 2010

Судя по ошибке, похоже, что вы объявили Node в структуре BSTree.Я думаю, что ваша проблема заключается в вашем типе возврата.Попробуйте объявить тип возвращаемого значения BSTree::Node*.

2 голосов
/ 17 октября 2010

Вы уже получили ответ на заданный вопрос. Я добавлю немного о том, как я написал бы код. Я предпочитаю что-то вроде этого:

Node* BSTree::findNode(const Node* current, const Object &target){
    if (current == NULL)
        return NULL;

    if (target < current->item)
        return findNode(current->left, target);
    if (current->item < target)
        return findNode(current->right, target);
    return current;
}

Это (потенциально) продолжается до current == NULL, вместо попытки остановиться, когда current->left == NULL или current->right == NULL, в зависимости от того, какое направление выбрано. Хотя это может спасти один уровень рекурсии, для этого требуется дублирование почти всей логики рекурсии в левую и правую ветви. Если вы не уверены, что рекурсия достаточно дорога, проверка текущего узла на NULL позволяет упростить код, объединив их. Эта версия кода также имеет то преимущество, что (как и большинство контейнеров C ++) для определения operator< требуется только Object, а не operator==.

Если вы хотите пойти дальше, вы можете поместить указатели на левую и правую ветви в массиве и еще больше упростить код:

// presumes BSTree::Node is defined something like this:
class BSTree {
    class Node { 
        // subnodes[0] == left subtree
        // subnodes[1] == right subtree
        Node subnodes[2];
    };
};

BSTree::Node* BSTree::findNode(const Node* current, const Object &target){
    if (current == NULL)
        return NULL;

    if (current->item == target) 
        return current;

    return findNode(subnodes[target < current->item]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...