带有 1 个参数的 C++ 默认模板构造函数

橘子皮

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

问题其实很简单:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

错误C2064:术语未评估为带有1个参数/使用模板的函数

来自分类Dev

C ++模板构造函数默认参数

来自分类Dev

C ++中带有另一个模板类作为参数的构造函数

来自分类Dev

具有一个默认参数和一个变量参数的C ++构造函数

来自分类Dev

C ++模板类“没有合适的默认构造函数”

来自分类Dev

在C ++中的模板实例化中将带有构造函数的类用作类型参数

来自分类Dev

C ++:从模板类继承并带有可能变化的构造函数参数

来自分类Dev

带有参数包的类模板的构造函数给出了 C3520 错误

来自分类Dev

为什么此宏接受带有1个参数的模板而拒绝带有2个参数的模板?

来自分类Dev

C ++ 0/1参数构造函数传递给模板构造函数时未按预期进行链接

来自分类Dev

C#'SerialPort'不包含带有6个参数的构造函数

来自分类Dev

C#错误:不包含带有0个参数的构造函数

来自分类Dev

具有参数副本构造函数的C ++模板类

来自分类Dev

存在具有默认参数的构造函数时,c ++构造函数中的歧义

来自分类Dev

带有对象指针作为参数的C ++复制构造函数

来自分类Dev

如何编写带有模板参数的离线构造函数?

来自分类Dev

默认(用户定义)构造函数和带有默认参数的构造函数之间的区别?

来自分类Dev

不带有任意参数的c ++函数模板

来自分类Dev

是否可以有一个默认的复制构造函数和一个模板化转换构造函数?

来自分类Dev

是否可以有一个默认的复制构造函数和一个模板化转换构造函数?

来自分类Dev

C ++ 11:可变参数lambda模板,用于调用类型的默认构造函数

来自分类Dev

extern数组作为带有clang c ++ 1z的非类型模板参数

来自分类Dev

函数不接受1个参数C ++

来自分类Dev

二次方程式-错误C2064:术语未求值为带有1个参数的函数

来自分类Dev

类不包含带有0个参数的构造函数

来自分类Dev

构造一个带有无限参数的函数

来自分类Dev

DefaultHttpControllerSelector不包含带有0个参数的构造函数

来自分类Dev

错误:不包含带有0个参数的构造函数

来自分类Dev

'ServiceCollection'不包含带有0个参数的构造函数

Related 相关文章

  1. 1

    错误C2064:术语未评估为带有1个参数/使用模板的函数

  2. 2

    C ++模板构造函数默认参数

  3. 3

    C ++中带有另一个模板类作为参数的构造函数

  4. 4

    具有一个默认参数和一个变量参数的C ++构造函数

  5. 5

    C ++模板类“没有合适的默认构造函数”

  6. 6

    在C ++中的模板实例化中将带有构造函数的类用作类型参数

  7. 7

    C ++:从模板类继承并带有可能变化的构造函数参数

  8. 8

    带有参数包的类模板的构造函数给出了 C3520 错误

  9. 9

    为什么此宏接受带有1个参数的模板而拒绝带有2个参数的模板?

  10. 10

    C ++ 0/1参数构造函数传递给模板构造函数时未按预期进行链接

  11. 11

    C#'SerialPort'不包含带有6个参数的构造函数

  12. 12

    C#错误:不包含带有0个参数的构造函数

  13. 13

    具有参数副本构造函数的C ++模板类

  14. 14

    存在具有默认参数的构造函数时,c ++构造函数中的歧义

  15. 15

    带有对象指针作为参数的C ++复制构造函数

  16. 16

    如何编写带有模板参数的离线构造函数?

  17. 17

    默认(用户定义)构造函数和带有默认参数的构造函数之间的区别?

  18. 18

    不带有任意参数的c ++函数模板

  19. 19

    是否可以有一个默认的复制构造函数和一个模板化转换构造函数?

  20. 20

    是否可以有一个默认的复制构造函数和一个模板化转换构造函数?

  21. 21

    C ++ 11:可变参数lambda模板,用于调用类型的默认构造函数

  22. 22

    extern数组作为带有clang c ++ 1z的非类型模板参数

  23. 23

    函数不接受1个参数C ++

  24. 24

    二次方程式-错误C2064:术语未求值为带有1个参数的函数

  25. 25

    类不包含带有0个参数的构造函数

  26. 26

    构造一个带有无限参数的函数

  27. 27

    DefaultHttpControllerSelector不包含带有0个参数的构造函数

  28. 28

    错误:不包含带有0个参数的构造函数

  29. 29

    'ServiceCollection'不包含带有0个参数的构造函数

热门标签

归档