Причина, по которой ваш код не работает, заключается в том, что вы пытаетесь присвоить значение указателю std::string *id
путем разыменования *id = " "
и *id = i
, когда указателю id
не выделена память.Это означает, что его нельзя разыменовать.
Существует несколько способов «исправить» вашу программу.
Опция 1: Сделать std::string *id
const и назначить адреспеременная user_id
из main.
class MinPriorityQueue
{
private:
class Element
{
private:
const std::string *id;
int key;
public:
Element(const std::string &i, int k)
{
id = &i;
key = k;
}
~Element() = default;
};
std::vector<Element*> minheap;
public:
void insert(const std::string &s, int k)
{
minheap.push_back(new Element(s,k));
}
};
int main()
{
MinPriorityQueue minQue;
std::string user_id = "test";
minQue.insert(user_id, 2);
}
Опция 2: Выделить память для std::string *id
.
class MinPriorityQueue
{
private:
class Element
{
private:
std::string *id;
int key;
public:
Element(const std::string &i, int k)
{
id = new std::string(i);
key = k;
}
~Element() = default;
};
std::vector<Element*> minheap;
public:
void insert(const std::string &s, int k)
{
minheap.push_back(new Element(s,k));
}
};
int main()
{
MinPriorityQueue minQue;
minQue.insert("test", 2);
}
Опция 3: Удалите const
из параметров функции, чтобы его 'адрес мог быть назначен неконстантному указателю члена.
class MinPriorityQueue
{
private:
class Element
{
private:
std::string *id;
int key;
public:
Element(std::string &i, int k)
{
id = &i;
key = k;
}
~Element() = default;
};
std::vector<Element*> minheap;
public:
void insert(std::string &s, int k)
{
minheap.push_back(new Element(s,k));
}
};
int main()
{
MinPriorityQueue minQue;
std::string user_id = "test";
minQue.insert(user_id, 2);
}
Опция 4 (и мой личный фаворит): Преобразовать указатель std::string *id;
в обычную строку std::string id;
.
пс.При использовании метода указателя ваш конструктор по умолчанию должен либо выделить память и инициализировать строку пустой строкой std::string *id = new std::string("");
, либо определить ее как нулевой указатель std::string *id = nullptr;
.
Надеюсь, это поможет.