如何正确访问通过引用从标准输入传递给构造函数的参数的值



我正在尝试创建一个最小优先级队列,我遇到的问题之一是我无法弄清楚如何初始化我在命令行输入的参数的值......当我尝试输入值时,我遇到了一个 seg 错误。

我觉得我错过了一些非常明显的东西,但我在尽头试图弄清楚这一点。非常感谢任何帮助,因为我对编码很陌生。谢谢。。

    //header file 
   #ifndef __MinPriorityQueue
   #define __MinPriorityQueue
   #include <string>
   #include <list>
   #include <vector>
   using std::vector;
   using std::string;
   using std::list;
class MinPriorityQueue{
    public:
        MinPriorityQueue();                       //constructor
        ~MinPriorityQueue();                      //destructor
        void insert(const string&, int key);      //insert string and key
        void decreaseKey(const string id, int newKey);  //decreases key in minqueu
        string extractMin();                      //extracts the min string
    private:
        void buildMinHeap();     //produces a min heap from an unordered array
        void minHeapify(int i);  //maintain the min-heap property
        int parent(int i);       //returns min value 
        int left(int i);         //returns smaller val
        int right(int i);        //returns larger val
        class Element
        {
            public:
                Element();
                Element(const string& id, int key);
                ~Element();
            private:
                string* id;
                int key;
        };
        vector<Element*>minheap;
};
#endif

文件.cpp

MinPriorityQueue::Element::Element()
{
    *id="";
    key=0;
}
MinPriorityQueue::Element::Element(const string& i, int k )
{
    *id=i;//segfaults here
    key=k;
}

主.cpp

#include "minpriority.h"
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
int main(){
    char command='w';
    cin>> command;
    MinPriorityQueue minQue;
    while(command!='q'){
        if (command== 'a')
        {
            string id;
            int key;
            cin>>id>>key;
            minQue.insert(id, key);
        }
        else if (command== 'd')
        {
            string id;
            int key;
            cin>>id>>key;
            minQue.decreaseKey(id, key);
        }
        else if (command== 'x')
        {
            cout<<minQue.extractMin()<<endl;
        }
        cin>>command;
    }
    return 0;
}

代码不起作用的原因是,当指针id没有分配内存时,您尝试通过取消引用*id = " "*id = i来分配指针std::string *id的值。这意味着它不能被取消引用。

有多种方法可以"修复"您的程序。

选项 1:使 std::string *id const 并从 main 分配user_id变量的地址。

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,以便将其地址分配给非 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;

附言。使用 pointer 方法,默认构造函数应分配内存并将字符串初始化为空字符串std::string *id = new std::string("");或将其定义为空指针std::string *id = nullptr;

希望这有帮助。

最新更新