Шаблон класса, недопустимый нулевой указатель (строка)

0

Создал класс шаблона, который удовлетворяет и отлично работает с целыми числами, когда я пытаюсь запустить со строками, я получаю недопустимую ошибку нулевого указателя.

Я только добавил в методах, где создается куча, где и была найдена ошибка.

//heap.h
#include <iostream>
#include <vector>
using namespace std;

template<class TYPE>
class Heap{
private:

    vector<TYPE> heap;
    int size;// number of elements in the heap
    bool maxheap = true;//default value
    TYPE bubble_up(TYPE item);
    TYPE bubble_down(TYPE item);

public:

    Heap();
    Heap(bool maxheap);
    Heap(vector<TYPE>, bool order);
    ~Heap();
    void build_heap();
    TYPE Insert(TYPE item);
    TYPE Delete(TYPE& item);
    const vector<TYPE> sort(bool order);
    const vector<TYPE> sort();// defualt sort if no variable given, max sort
    TYPE get_size();
    void print_heap();
    void clear_heap();
};

template<class TYPE>
Heap<TYPE>::Heap(){
    TYPE dummy = 0;
    heap.push_back(dummy);
    size = heap.size() - 1;
}

template<class TYPE>
Heap<TYPE>::Heap(bool order){
    maxheap = order; // true is max, false is min
    TYPE dummy = 0;
    heap.push_back(dummy);
    size = heap.size() - 1;

}

template<class TYPE>
Heap<TYPE>::Heap(vector<TYPE> x, bool order){
    maxheap = order;// true is max, false is min
    TYPE tempSize;
    TYPE dummy = 0;
    heap.push_back(dummy);
    size = heap.size() - 1;
    tempSize = x.size();
    for (TYPE y = 0; y < tempSize; y++){
        heap.push_back(x[y]);
    }
    size = heap.size() - 1;
    build_heap();
}

Я вырезал часть, где проблема была обнаружена в следующих нескольких строках кода.

//driver.cpp
#include <iostream>
#include <string>
#include "Heap.h"

using std::cout;
using std::endl;

typedef string TYPE;

int main(void) {

    Heap<std::string> *s_heap = new Heap<std::string>();  // string heap
    std::string s_item = "0";
}

"Утверждение отладки не удалось!" "Выражение: неверный нулевой указатель"

  • 0
    TYPE dummy = 0; бесполезно, если TYPE является std :: string - сделать его TYPE dummy (все еще сомнительно, но лучше)
  • 0
    @ DieterLücking TYPE dummy{}; или TYPE dummy = TYPE(); ,
Показать ещё 1 комментарий
Теги:
pointers
templates
null

1 ответ

2
Лучший ответ
template<class TYPE>
Heap<TYPE>::Heap(){
    TYPE dummy = 0;
    heap.push_back(dummy);
    size = heap.size() - 1;
}

Первая строка будет переведена на:

 std:string dummy = 0;

Я не думаю, что вы можете установить строку в ноль.

попробуйте изменить его на:

TYPE dummy = TYPE();

ОБНОВЛЕНИЕ: как отмечает juanchopanza, современный синтаксис:

TYPE dummy{}; 

(Я все еще живу в прошлом...)

  • 0
    Верный. «установка» строки в ноль вызывает конструктор const char* , который предполагает указатель на строку с нулевым символом в конце.
  • 0
    Что объясняет «Неверный нулевой указатель».
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню