【问题标题】:C++ Default Templated Constructor With 1 Parameter具有 1 个参数的 C++ 默认模板化构造函数
【发布时间】:2017-05-07 19:52:56
【问题描述】:

我正在尝试创建一个用于 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)

【问题讨论】:

  • 都包含在 main.
  • 您的问题不完全来自显示的代码。顺便说一句:您的模板化单参数构造函数的实现不正确
  • 显示代码。您发布的代码中未定义某些功能!
  • 我把整个事情都搞砸了,我试图保持简单。
  • @orangepeelsnice...不,不,不! ..请不要整件事(除非它相当短)。只是重现您的问题的相关最短代码。见Minimal, Complete, and Verifiable Example

标签: c++ algorithm c++11 binary-search-tree


【解决方案1】:

问题其实很简单:

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) 创建一个本地 将为其调用默认构造函数的变量,其中 turn 将创建另一个局部变量,再次为其默认 构造函数将被调用,一直持续到你得到一个堆栈 溢出。

构造函数应该如下所示:

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 );
}

【讨论】:

  • -1。构造函数初始化一个局部变量,但成员变量 item 的类型是 std::string。它将是一个空字符串,访问它没有错。
  • 我同意你关于构造函数应该是什么样子的观点,但是你关于成员变量在作用域末尾不存在的说法是不正确的。
  • 等等,所以我不需要在我的节点类中删除一个对象,它实际上已经在 main 中声明了?
  • @GlühwürmchenimHimmel 谢谢,它有效。看来我仍在尝试用 oop 敲定细节。
  • @orangepeelsnice 一个隐式的“this”指针被传递给构造函数和所有其他成员函数,它们指向调用该函数的对象
【解决方案2】:

您的构造函数将通过无限递归导致堆栈溢出。

BinaryNode::BinaryNode(ItemType newItem) 创建一个局部变量 将为其调用默认构造函数,这又会创建另一个局部变量,将再次为其调用默认构造函数,一直持续到堆栈溢出为止。

您应该根据 Glühwürmchen im Himmel 的帖子更改您的构造函数。

【讨论】:

    猜你喜欢
    • 2016-03-01
    • 2014-05-18
    • 2011-03-27
    • 1970-01-01
    • 2017-09-27
    • 2018-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    相关资源
    最近更新 更多