我正在尝试创建一个用于 BinarySearchTree 的 BinaryNode 类。当我尝试测试这段代码并运行下面的程序时,它编译没有错误,但是当程序运行时,它停止并返回:分段错误(核心转储)
谁能看到我的错误?
#ifndef _NODE
#define _NODE
#include <string>
#include <iostream>
using namespace std;
template<class ItemType>
class BinaryNode
{
private:
ItemType item; //any data type
BinaryNode<ItemType>* leftChild;
BinaryNode<ItemType>* rightChild;
public:
BinaryNode();
BinaryNode( ItemType newItem );
void setItem(ItemType newData);
ItemType getData() { return item;}
BinaryNode<ItemType>* getLeftChild() { return leftChild; }
BinaryNode<ItemType>* getRightChild() { return rightChild; }
void setLeftChild(BinaryNode<ItemType>* newLeftPtr) { leftChild = newLeftPtr;}
void setRightChild(BinaryNode<ItemType>* newRightPtr) { rightChild = newRightPtr;}
//void display(BinaryNode* rootNode);
};
template<class ItemType>
BinaryNode<ItemType>::BinaryNode()
{
BinaryNode newNode;
newNode.setItem( NULL );
newNode.setLeftChild( nullptr);
newNode.setRightChild( nullptr );
}
template<class ItemType>
BinaryNode<ItemType>::BinaryNode(ItemType newItem)
{
BinaryNode newNode;
newNode.setItem( newItem );
newNode.setLeftChild( nullptr );
newNode.setRightChild( nullptr );
}
template<class ItemType>
void BinaryNode<ItemType>::setItem(ItemType newData)
{
item = newData;
}
#endif
******************* MAIN *************************************
#include<iostream>
#include <string>
#include "BinaryNode.h"
using namespace std;
int main()
{
BinaryNode<string> newNode("string");
cout << newNode.getData() << endl;
return 0;
}
********************** ERROR ***************************
Segmentation fault (core dumped)
问题其实很简单:
template<class ItemType>
BinaryNode<ItemType>::BinaryNode(ItemType newItem)
{
BinaryNode newNode;
newNode.setItem( newItem );
newNode.setLeftChild( nullptr );
newNode.setRightChild( nullptr );
}
在采用 的构造函数中ItemType
,您创建了一个局部变量newNode
。在此范围的末尾,该对象的析构函数被调用,因此它不再存在。
编辑:但是您遇到分段错误的原因是由于无限递归,如 opetroch 的帖子中所述:
您的构造函数将通过无限递归导致堆栈溢出。
BinaryNode::BinaryNode(ItemType newItem) 创建一个局部变量,为其调用默认构造函数,这反过来将创建另一个局部变量,再次调用默认构造函数,一直持续到堆栈溢出。
构造函数应该看起来像:
template<class ItemType>
BinaryNode<ItemType>::BinaryNode(ItemType newItem)
{
setItem( newItem );
setLeftChild( nullptr );
setRightChild( nullptr );
}
因为一个隐式的“this”指针被传递给构造函数和所有其他成员函数,它们指向调用函数的对象。这是您需要修改以获得所需行为的对象。您甚至可以通过如下编写构造函数来使其真正明确:
template<class ItemType>
BinaryNode<ItemType>::BinaryNode(ItemType newItem)
{
this->setItem( newItem );
this->setLeftChild( nullptr );
this->setRightChild( nullptr );
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句