学校向けのプロジェクトに取り組んでいます。自動販売機でソーダを買う学生をシミュレートします。クラス Student のメンバーである Card というクラスがあります。あれは、
すべての生徒がカードを持っていますが、これは理にかなっています。
class Student {
public:
Student( Office &cardOffice );
~Student();
bool action();
private:
Office* studentOffice; // stores cardoffice.
Card* card; // stores card
};
学生証は、studentOffice.create() 関数の呼び出しによって作成されます。その関数はカードを返します。
Card* Office::create( int id, int money ) {
Card* card = new Card();
card->id = id;
card->amount = money;
return card;
}
学生は、VendingMachine クラスの action() という関数を呼び出して、食べ物を購入します。VendingMachine の buy 関数は、VendingMachine クラスの Status 列挙から型列挙を返します。
0 から 9 までの乱数を生成する prng があります。課題では、10 分の 1 の確率で学生のカードが破棄されることが示されています。そして、次に Student.action() が呼び出されたときに新しいものを取得します。
VendingMachine::Status VendingMachine::buy(Card* &card)
{
if(prng(9) == 0) // generates number from 0-9
{
delete card;
}
return status;
}
もともと、学生の action() ルーチンをチェックインして、カードが NULL (削除された場合) かどうかを確認し、それが発生した場合は新しいカードを作成することを考えていました。ただし、コードがカードの削除部分に到達することはわかっていますが、カードがNULLであることを確認すると失敗します。つまり、カードが null ではないということです。つまり、削除が機能しなかったということです。
しかし、渡されたカードのタイプが
Card* &card
次に、学生がこのルーチンを呼び出したものであり、「this」がそれを呼び出したオブジェクトを指すことを知っているので、「this」ポインターを使用して呼び出しを使用することを考えていました。
メンバー関数が呼び出されるオブジェクトを指します。http://msdn.microsoft.com/en-us/library/y0dddwwd(v=vs.80).aspxから
しかし、もしそうなら:
if(prng(9) == 0)
{
delete this->card;
}
メイクファイルを実行すると、次のエラーが表示されます。
エラー: クラス VendingMachine に card という名前のメンバーがありません
これは本当ですが、そうではありません。コンパイラは、VendingMachine がこのメソッドを呼び出すと想定していますか? 生徒がそうするからです。
すべての自動販売機に生徒を追加し、代わりにそのメンバーからカードを削除する必要がありますか? 複数の学生がいて、この自動販売機に割り当てられている場合は全員を保管する必要があるため、これを行わないことを強く望んでいます。とはいえ、やっぱりこうすればいいんですけどね。
カードの削除が発生したが、カードが NULL ではない場合、カードを削除したときに正確に何がダウンしたのですか?
カードを削除するにはどうすればよいですか?
ありがとう!
編集:変更を適用した後、コードは次のようになります。
if(prng(9) == 0)
{
cout << "Destroying card" << endl;
delete card;
card = NULL;
cout << "Card Destroyed" << endl;
}
残念ながら、segfault が発生します。これはおそらく、存在しない破壊されたカードにアクセスしているためです。Destroying card と Card Destroyed が表示されるので、
しかし、この通話で私が持っているカウントは表示されません:
if(card == NULL)
{
cout << "CARD DESTROYEDADJIWJDOQIODJWDIOJWQODWODIQODJWJOWDW" << endl;
card = studentOffice->create(id, 5);
}
明らかに、カードはまだ NULL ではありませんか? これは奇妙です。
EDIT2:問題がどこにあるのか、なぜセグメンテーション違反があるのか はわかっていると思います。現在取り組んでいます。
EDIT3: カードが破壊されたときに使用した呼び出しの順序を並べ替えて解決しました。