[英]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;
}
在上面的代碼中兩個構造創建本地Person
, p
,然后你有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.