0

これが私の HeapNode テンプレート クラスの定義です。

#ifndef HEAP_N

#define HEAP_N

template <class T>
class HeapNode{

public:
    // Constructor
    HeapNode(T item = T(), int new_freq = 0, int new_right = 1, 
             int new_left = 1, int new_parent = 1);

    // Accessor Functions
    T data();
    int frequency();
    int right_child();
    int left_child();
    int parent();

    // Mutator Functions
    void set_data(T item);
    void set_frequency(int new_freq);
    void set_right(int new_right);
    void set_left(int new_left);
    void set_parent(int new_parent);

    // Operators
    HeapNode operator =(const HeapNode& other);
    bool operator >(const HeapNode& other);

private:
    T datafield;    // contains the data of the node
    int freq;       // frequency
    int l_child;    // index of left child
    int r_child;    // index of right child
    int parent_;    // index of parent
};

#include "HeapNode.template"

#endif

そして、これらはそれぞれミューテーターとアクセサー関数です:

template <class T>
void HeapNode<T>::set_data(T item){
    datafield = item;
}

template <class T>
T HeapNode<T>::data(){
    return(datafield);
}

関数呼び出しを行う関数は次のとおりです。

void insert_or_update(string value, Heap<HeapNode<string> >& heap){ 

    HeapNode<string> temp;
    temp.set_data(value);
    temp.set_frequency(1);

        string ex = temp.data(); // The seg fault actually occurs in the find() function below, but any attempt to get temp.data() seg faults so the location is irrelevant

    if(!heap.empty()){  
        int index = heap.find(temp);
        if(index != -1){
            heap.inc_frequency(index);          
        }
        else{
            heap.insert(temp);
        }
    }
    else{
        heap.insert(temp);
    }   
}

セグフォルトは

string ex = temp.data(); 

ライン。

これらの関数は非文字列オブジェクトに対して機能しますが、文字列 (定数文字列と可変文字列の両方) を使用するとセグ フォールトが発生します。

私は実装を使用してみました

datafield = item;

コピー コンストラクターを使用する行:

datafield = T(item);

しかし、それもうまくいきませんでした。参照渡しも設定もしない

datafield

パブリックメンバーになり、直接変更します。

注: これは C++ 98 コンパイラでコンパイルする必要があるため、文字列移動機能は使用できません!

さらに情報が必要な場合は、お知らせください。

どうもありがとう!

4

0 に答える 0