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

问题描述:

我想在我的代码中创建一个循环结构方法来遍历二叉搜索树。但是我在编译时遇到错误,并且不确定原因。在C++中声明一个struct方法

我在.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; 

} 
在CPP

的私人部分得到Node* findNode(const Node *, const Object &);

我产生了以下错误:

- 错误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。

提前感谢任何花时间阅读本文的人。

编辑:

回答科林的问题。

我的#include “BSTree.h” 在我的.cpp

而在.H我:

#ifndef BSTREE_H 
#define BSTREE_H 

#include <iostream> 
#include <fstream> 
+1

包括你的iostream和fstream的,但你包含.h文件? – Colin 2010-10-17 00:17:42

+1

此外,它听起来像编译器无法找到节点的定义 - 请确保将.h文件也包含在.h文件中 – Colin 2010-10-17 00:18:39

+0

请使用“1010101”按钮进行格式化,而不是将缩进添加到第一个和第最后一行。 – Potatoswatter 2010-10-17 00:19:10

从它看起来像你的BSTree内声明Node错误判断结构。我认为你的问题在于你的回报类型。尝试声明返回类型为BSTree::Node*

+0

...也就是说,'BSTree :: Node * BSTree :: findNode(const Node * current' – Potatoswatter 2010-10-17 00:21:30

+0

啊,那个修复它,谢谢你,并感谢你对Potatoswatter的澄清 – Moniker 2010-10-17 00:25:20

您已经为您提出的问题得到了答案。我会添加一些关于如何编写代码的信息。我喜欢这样的事情:

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,这取决于选择的方向停止。虽然这可以节省一个递归级别,但它需要将几乎所有的递归逻辑都复制到左侧和右侧分支来执行。除非您确定递归非常昂贵,否则检查当前节点是否为空,可以通过合并这两个来简化代码。该版本的代码还具有(像大多数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]); 
}