在C ++中声明一个struct方法

时间:2010-10-17 00:13:13

标签: c++ struct

我正在尝试在我的代码中创建一个循环结构方法来遍历二叉搜索树。但是我在编译时遇到错误并且不确定原因是什么。

我在.h文件的私有部分中有Node* findNode(const Node *, const Object &);

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;

}

在cpp。

我正在生成以下错误:

-error C2143:语法错误:缺少';'在'*'之前 -error C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int
-error C4430:缺少类型说明符 - 假设为int。注意:C ++不支持default-int
-error 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。

我提前感谢任何花时间阅读此内容的人。

编辑:

回答科林的问题。

我的.cpp

中有#include“BSTree.h”

在.h我有:

 #ifndef BSTREE_H  
 #define BSTREE_H  

 #include <iostream>  
 #include <fstream>  

2 个答案:

答案 0 :(得分:3)

从错误判断,您似乎已在Node结构中声明了BSTree。我认为你的问题在于你的回归类型。尝试将返回类型声明为BSTree::Node*

答案 1 :(得分:2)

您已经得到了问题的答案。我将添加一些关于我如何编写代码的内容。我更喜欢这样的东西:

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 == NULLcurrent->right == NULL时尝试停止,具体取决于选择的方向。虽然这可以节省一个级别的递归,但它需要复制几乎所有的递归到左右分支的逻辑来执行此操作。除非你真的确定递归是非常昂贵的,否则检查当前节点是否为NULL可以通过合并这两个来简化代码。此版本的代码还具有以下优势(与大多数C ++容器一样),只需要Object来定义operator<,而不是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]);
}