我正在为学校做一个项目。它模拟学生从自动售货机购买汽水。有一个名为 Card 的类,它是 Student 类的成员。那是,
每个学生都有一张卡片,这是有道理的。
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 枚举中返回一个类型枚举。
有一个 prng,生成一个从 0 到 9 的随机数。作业说学生的卡片有十分之一的机会被破坏。下次调用 student.action() 时,他/她将获得一个新的。
VendingMachine::Status VendingMachine::buy(Card* &card)
{
if(prng(9) == 0) // generates number from 0-9
{
delete card;
}
return status;
}
最初,我想检查学生的 action() 例程以查看卡是否为 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;
}
运行我的makefile时它给了我这个错误:
错误:VendingMachine 类没有名为 card 的成员
这是真的,它没有。编译器是否假设 VendingMachine 将调用此方法?因为学生会。
也许我应该在每台自动售货机上添加一个学生,然后从该成员那里删除该卡?我强烈不希望这样做,因为有多个学生,这意味着如果他们被分配到这台自动售货机,我需要将他们全部存储起来。虽然,如果归根结底,我可以这样做。
如果删除卡发生,但卡不是NULL,我删除卡时到底发生了什么?
我将如何删除卡?
谢谢!
编辑:应用更改后,代码现在是:
if(prng(9) == 0)
{
cout << "Destroying card" << endl;
delete card;
card = NULL;
cout << "Card Destroyed" << endl;
}
不幸的是,我遇到了段错误,这可能是因为我正在访问一张不存在的已损坏卡。因为显示了销毁卡和已销毁卡,
但是我在这个电话中的 cout 没有出现:
if(card == NULL)
{
cout << "CARD DESTROYEDADJIWJDOQIODJWDIOJWQODWODIQODJWJOWDW" << endl;
card = studentOffice->create(id, 5);
}
那么显然该卡仍然不是NULL?这很奇怪。
EDIT2:我想我知道问题出在哪里,以及为什么会出现段错误。现在正在处理它。
EDIT3:通过重新排列使用卡时使用卡的调用顺序来解决。