簡體   English   中英

C ++-類構造函數創建對象,但構造結果不同

[英]C++ - Class constructor creates objects, but the result of the construction is different

我在C ++中有一個課堂項目。 目的是在插入鏈表時對電話簿(txt文件)進行排序。

這些是類:

class Person
{
    public:
        string Name
        string Firstname;
        string Adress;
        int PostalCode;
        string Telephone;
        Person();
        ~Person();
};

class Link
{
    friend class List;
    Link *next;
    Person *pers;
    public:
        Link();
        Link(string data);
};

class List
{
    // debut is the start of the chained list
    Link *start;
    public:
        List(string data)
        {
            start = NewLinkPerson(data, NULL);
        }
};

Link::Link(string data)
{
    next = NULL;
    Person p;
    p.put_data(data);
    pers = &p;
}

Link::Link()
{
    next = NULL;
    Person p;
    pers = &p;
}

然后,函數NewLinkPerson如下所示:

Maillon * NewLinkPerson(string data, Maillon *ssuiv)
{
    Maillon * nouveau = new Maillon(data);
    nouveau->suiv = ssuiv;
    return nouveau;
}

問題在於創建的對象不是我命令他創建的程序的對象。 如果我在構造函數中輸出類型為Person的對象pers ,它將填充我詢問的數據。 但是當它離開構造函數時,數據消失了,並充滿了內存中的隨機字符串。

是什么原因引起的? 我已經嘗試了很多方法,但是似乎都沒有用,它們都主要返回了Segmentation Fault。

編輯 :我忘了放在那里的功能:

void Person::put_data(string data)
{
    int sep1 = data.find("|");
    int sep2 = data.find("|", sep1+1);
    int sep3 = data.find("|", sep2+1);
    int sep4 = data.find("|", sep3+1);
    Name = data.substr(0, sep1);
    Firstname = data.substr(sep1+1, sep2-sep1-1);
    Adress = data.substr(sep2+1, sep3-sep2-1);
    Telephone = data.substr(sep4+1, data.npos);
    string ccode = data.substr(sep3+1, sep4-sep3-1);
    PostalCode = std::stoi(ccode.c_str());
}

編輯2 :翻譯成英文

您的代碼有未定義的行為

Link::Link(string data)
{
    next = NULL;
    Person p;
    p.put_data(data);
    pers = &p;
}

Link::Link()
{
    next = NULL;
    Person p;
    pers = &p;
}

在上面的代碼中兩個構造創建本地Personp ,然后你有pers點了。 構造函數結束后, p超出范圍,被破壞,現在pers指向一個不再存在的對象。 此后任何對pers取消引用仍將指向已刪除的對象,這是未定義的行為。

要解決此問題,只需擺脫pers的指針。 如果將其存儲為值,則不需要任何動態內存分配,並且無需使用指針語法。 鏈接應該是

class Link
{
    friend class List;
    Link *next;
    Person pers; // no pointer here
    public:
        Link();
        Link(string data);
};

然后可以像

Link::Link(string data)
{
    next = NULL;
    pers.put_data(data);
}

Link::Link()
{
    next = NULL;
}

如果必須使用pers作為指針,則可以使用new為其分配持久性存儲。 如果這樣做,則需要確保在類的析構函數中將其delete ,並且具有復制符號。 有關此內容的更多信息,請參見什么是三規則?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM