C++ 段错误 : Passing a string to a node in a linked list

标签 c++ class templates

我是使用类模板的新手,我只是想在与链接列表关联的类中定义一个临时节点“temp”,它将节点存储的字符串设置为在通过用户输入函数 TowerHanoi::set_Discs(size_t disc)。当我调用函数 temp->set_data(tmp_str) 时,出现段错误。我尝试单独调用 temp->set_data("hello"); 但我仍然收到错误。 我不确定这里发生了什么,我已经尝试研究它但无济于事。我可能遗漏了一些明显的东西,但我现在完全迷路了。如果您需要更多代码,请告诉我。谢谢。

TowerHanoi.cpp:

#include "TowerHanoi.h"
#include <iostream>
#include <cstdlib>

using namespace std;
using oreilly_A2::node;

namespace oreilly_A2 {
    TowerHanoi::TowerHanoi() {
        for (int i=0;i<2;i++) {
            rod[i] = LStack<node<std::string> >();
        }
    }

    TowerHanoi::TowerHanoi(size_t numDiscs) {
        for (int i=0; i < 2; i++) {
            rod[i] = LStack<node<string> >();
        }
        discs = numDiscs;

    }

    void TowerHanoi::set_Discs(size_t disc) {
        node<string>* temp=NULL;

        while (disc != 0) {
            string tmp_str;
            for (size_t i=0; i<disc; i++) {
                tmp_str.append("x");

            }
            disc--;
        temp->set_data(tmp_str);
        rod[0].push(temp);
    }

    void TowerHanoi::print_Game() {

        for (size_t s=1; s<discs; s++) {
                cout << "   "; 
                    for (size_t o=1; o<discs-s;o++) {
                        cout << " ";
                    }
                //cout << tmp_node->data() << endl;
                    cout << "x" << endl;
            }
    }

}

node.h 文件:

#ifndef NODE_CAMERON_H
#define NODE_CAMERON_H
#include <string>

namespace oreilly_A2 {
    template <typename Item>
        class node {

        public:

        node(); //constructor for node

        node(const Item val, node* newNext); //constructor with parameters

        ~node(); //destructor

        void set_data(Item new_data); //set the word that this node contains

        void set_link(node* new_link); //set the 'next' node
        void set_previous(node* new_prev);

        Item data() const; //return this node's word

        const node* link() const; //return next

        const node* back() const;

        node* link(); //return next

        node* back(); 

        private:

        node* next; //the next node
        node* previous;
        Item word; //the word this node contains

        };
}
#include "Node.template"
#endif

node.template 文件:

    namespace oreilly_A2 {


    template <typename Item>
    node<Item>::node() {
        next=NULL;
        previous=NULL;
    }
    //Node.template
    template <typename Item>
    node<Item>::node(const Item val, node* newNext=NULL) {
        word = val;
        next = newNext;
    }

    template <typename Item>
    node<Item>::~node() {
        delete next;
        delete previous;
        delete word;
    }

    template <typename Item>
    void node<Item>::set_data(Item new_data){
            word = new_data;
    }


    template <typename Item>
    void node<Item>::set_link(node* new_link){
            next = new_link;

    }


    template <typename Item>
    void node<Item>::set_previous(node* new_back) {
            previous = new_back;
    }


    template <typename Item>
    Item node<Item>::data() const {  //return the word
            return word;
    }


    template <typename Item>
    const node<Item>* node<Item>::link() const { //return next node (const function)
            return next;
    }


    template <typename Item>
    const node<Item>* node<Item>::back() const { //return previous node (const)
            return previous;
    }


    template <typename Item>
    node<Item>* node<Item>::link() {
            return next; //return next node (non-const)
    }


    template <typename Item>
    node<Item>* node<Item>::back() { //return previous node (const)
            return previous;
    }

}

最佳答案

除非我遗漏了什么,否则在调用 set_datatemp 变量为 NULL。与任何常规对象一样,您需要先对其进行初始化。

node<string>* temp=new node<string>();

然后在适当的时候释放它以避免内存泄漏。

temp_str 不是这种情况,因为后者不是指针,它是一个值,因此它会自动初始化(并且在超出范围时也会自动释放)。

关于C++ 段错误 : Passing a string to a node in a linked list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33007320/

相关文章:

javascript - 是否有适用于 Adob​​e Air 应用程序的 JavaScript 模板引擎?

c++ - 使用枚举作为模板参数

c++ - 在 C++ 中使用 std::getline() 的签名错误

android - 如何将 Crypto++ 与 Jni 或 NDK 一起用于 Android 应用程序

c++ - cv::Mat 来自外部原始指针数据,释放自身

Java - 无法添加文本

C# 错误消息 : Cannot Implicitly convert type

php - 在多页表单上使用类