c++ - 自定义字典类 C++ 中的段错误

标签 c++

因此,作为我在计算机科学领域的作业的一部分,即阅读推文并将其放入自定义词典中,您猜对了,我必须创建一个词典。然而,在使用字典进行测试期间,我遇到了一个错误,尽管尝试了数小时的故障排除,但我仍无法修复。我已经缩小了范围,并确定错误在第 144 行,在语句 cout<<j.get("name").getFront()->getText(); 的某处。 ,但我一直无法确定是哪一部分导致了问题,即使将其按部分分解也是如此,除了它是在我添加 ->getText() 时开始的。 ,但是我严重怀疑问题很早就开始了。

很抱歉,如果我不是太具体,或者我太啰嗦了,我刚刚在这方面遇到了一段时间的麻烦,并且开始感到沮丧。

我明白并非所有的执行或风格都是最好的,所以我可能会要求您不要对事情的完成方式发表评论,除非它可能与手头的问题直接相关。

感谢您提供的所有帮助。

/*********************************************************************************************************************
 * [REDACTED]                                                                                                        *
 * CS 101-- Project 4 (Hashing Twitter)                                                                              *
 * This program stores Twitter posts in a hash table                                                                 *                                                                                                        *
 *********************************************************************************************************************/

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;
class tweet {
    private:
        string create_at;
        string text;
        string screen_name;
    public:
        string getCreate_at() {
            return create_at;
        };
        string getText() {
            return text;
        };
        string getScreen_name() {
            return screen_name;
        };
        void setCreate_at(string c) {
            create_at=c;
        };
        void setText(string c) {
            text=c;
        };
        void setScreen_name(string c) {
            screen_name=c;
        };
};
class LinkedList {
    public:
        tweet* getFront() {
            return top;
        };
        LinkedList* getNext() {
            return next;
        };
        void setNext(LinkedList* c) {
            next = c;
        };
        void setTweet(tweet c) {
            top = &c;
        };
        void setTweet(tweet* c) {
            top = c;
        };
        void insertFront(tweet c) {
            LinkedList temp;
            temp.setTweet(top);
            temp.setNext(next);
            this->setTweet(c);
            this->setNext(&temp);
        };
        tweet* removeFront() {
            tweet* temp;
            temp = top;
            if(next != NULL){
                top = next->getFront();
                if(next->getNext() != NULL)
                    next = next->getNext();
            }
            return temp;
        };
    private:
        tweet* top;
        LinkedList* next;
};
class HashTable {
    private:
        vector<LinkedList> store [256];//access by firstcharacter of name as index of array then search through vector linearly until find key 
        LinkedList getLinkedList(string c) {
            vector<LinkedList> temp=store[(int)c.c_str()[0]];
            for(int i =0;i<temp.size();i++) {
                if(temp.at(i).getFront()->getScreen_name()==c) {
                    return temp.at(i); //gets list of tweets
                }
            };
        };
        bool keyExists(string c) {
            vector<LinkedList> temp = store[(int)c.c_str()[0]];
            for(int i =0;i<temp.size();i++) {
                if(temp.at(i).getFront()->getScreen_name()==c) {
                    return true; //gets list of tweets
                }
            };
            return false;
        };
        void insertTweet(tweet c){
            if(keyExists(c.getScreen_name())){
                getLinkedList(c.getScreen_name()).insertFront(c);
            } else {
                LinkedList temp;
                temp.setTweet(c);
                store[c.getScreen_name().c_str()[0]].push_back(temp);
            }
        };
    public:
        void put(tweet c) {
            insertTweet(c);
        };
        LinkedList get(string key) {
            return getLinkedList(key);
        };
        bool contains(string key) {
            return keyExists(key);
        };
        void remove(string key) {
            vector<LinkedList> temp=store[key.c_str()[0]];
            for(int i =0;i<temp.size();i++) {
                if(temp.at(i).getFront()->getScreen_name()==key) {
                    temp.erase(temp.begin()+i); //gets list of tweets
                }
            };
        };
};
HashTable parser(string filename) {
    //backslashes
};
int main(int argc, char *argv[])
{
    tweet hello;
    hello.setText("hello");
    hello.setScreen_name("user");
    hello.setCreate_at("10211997");
    tweet heyo;
    heyo.setText("heyo");
    heyo.setScreen_name("name");
    heyo.setCreate_at("79912101");
    LinkedList jerome;
    jerome.insertFront(hello);
    cout<<jerome.getFront()->getText()<<endl;
    jerome.insertFront(heyo);
    cout<<jerome.removeFront()->getText()<<endl;
    HashTable j;
    j.put(heyo);
    cout<<j.get("name").getFront()->getText();
}

最佳答案

您正在获取临时地址:

    void insertFront(tweet c) {
        LinkedList temp;
        temp.setTweet(top);
        temp.setNext(next);
        this->setTweet(c); //should be &c, but c is a temporary!
        this->setNext(&temp); //temp is a temporary!
    };

此外,在 HashTable 中,您需要 putinsertTweet 来获得 tweet& 参数。

最后,还是在insertTweet中,把c的地址传给setTweet。

请注意,此代码非常脆弱,因为一旦推文对象超出范围,您就会有悬空指针。

关于c++ - 自定义字典类 C++ 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33403409/

相关文章:

c++ - 如何从 SDL_TEXTINPUT 获取 utf-8 输入?

c++ - SDL_BlitSurface 不起作用 - 我在我的表面上看不到图像

C++ 传递对象的速度有多快?

c++ - 来自函数签名的 const 函数签名

c++ - 如何以对数时间访问 C++ std::set 中的第 k 个元素?

c++ - 使用 VC++ 9 boost 警告

c++ - 为三角矩阵计算优化 CUDA 内核的执行

c++ - QRegularExpression 源字符串中的匹配位置

c++ - 如何列出 XCOFF TOC 条目

c++ - 多个类的共享模板成员函数