1

タイトルすみません。以下のコードは、問題の説明に役立つ場合があります。すでにクラスを設定していStudentます。このようにする場合:

Student stu1(score, "sam",5, "aaa", "123dfkj@gmail.COM","156412", "518105" );
Student *tempSt = &stu1;

coutの文字列メンバーを試してみましたがtempSt、動作します。ただし、次の場合、文字列メンバーは空になります。

tempSt = &Student(score, "sam",6, "aaa", "123dfkj@QQ.COM","156412", "518105" );

何が起こっている?私の貧弱な説明を理解していただければ幸いです:)

アップデート:

問題は次のことから生じます。

void myList::add(Student *a) {
slistNode *tempNode = new slistNode();
tempNode->data = a;

if(lastNode == NULL) {
    headNode = tempNode;
    lastNode = tempNode;
} else {
    lastNode->next = tempNode;
    lastNode = tempNode;
}

++listLength;

}

これらの obj をリストに入れようとするので、それらの obj を一時的なものにしたい (実際には名前を付けたくない)。stu1, stu2, stu3 のような obj をたくさん作りたくない....

slistNode クラス:

class slistNode {
public:
slistNode() { 
    next = NULL;
}
Student *data;
slistNode *next;
};
4

2 に答える 2

4

一時オブジェクトへのポインターを取得します。このポインターが指すオブジェクトは、コードが次の行に到達する前に破棄されます。もちろん、オブジェクトが破棄されると、文字列メンバーにアクセスすると、未定義の動作が呼び出されます。

于 2013-06-26T07:55:21.807 に答える
3

2 番目のケースでは、次のようになります。

Student(score, "sam",6, "aaa", "123dfkj@QQ.COM","156412", "518105" );

一時オブジェクトを構築します。それは建設直後に破壊されています。そのアドレスを取得すると、未定義の動作が呼び出されます。

(C++ の代わりに C で始めた場合、コンパイラはあなたが自殺することさえ許しません。C++ での頭の悪い設計上の決定に賛成です!)

于 2013-06-26T07:56:25.187 に答える