在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>
从它看起来像你的BSTree
内声明Node
错误判断结构。我认为你的问题在于你的回报类型。尝试声明返回类型为BSTree::Node*
。
...也就是说,'BSTree :: Node * BSTree :: findNode(const Node * current' – Potatoswatter 2010-10-17 00:21:30
啊,那个修复它,谢谢你,并感谢你对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]);
}
包括你的iostream和fstream的,但你包含.h文件? – Colin 2010-10-17 00:17:42
此外,它听起来像编译器无法找到节点的定义 - 请确保将.h文件也包含在.h文件中 – Colin 2010-10-17 00:18:39
请使用“1010101”按钮进行格式化,而不是将缩进添加到第一个和第最后一行。 – Potatoswatter 2010-10-17 00:19:10