一个基础的问题,请高手近来赐教,低手近来学习。谢谢!!

Easych 2004-05-06 04:30:34
在下面的程序中想删除pcard居然删除不了,按道理讲鼠标单击之后,pcard就被删除了,可是它还在,仍响应下一次操作。其中的Card是我定义的一个类,具体的实现可看后面。

程序如下:
#include <bitmap>
#include<iostream>
#include"Card.h"
using namespace std;

SimpleWindow *myWindow=new SimpleWindow("myWindow",15.,9.,Position(1.,1.));
Card *pcard;
int MouseEvent(const Position &p)
{
if(pcard->IsHited(p))
{
delete pcard; //就是这里,单击之后,它没被删除,下次还响应
//什么原因????
cout<<"has delete"<<endl;//这个信息每次都输出

}
return 1;

}


int ApiMain()
{
myWindow->Open();
pcard=new Card("c1.bmp",1,Club,*myWindow);
pcard->Draw();
myWindow->SetMouseClickCallback(MouseEvent);
return 0;
}

下面是Card类的实现 Card.cpp

#include <cassert>
#include <bitmap>
#include <randint>
#include"Card.h"

//此处为构造函数
Card::Card(string BmpFile,int Value, DesignAndColor CardDesign,
SimpleWindow &W):CardValue(Value),Window(W),
CardDesignAndColor(CardDesign),IsFaceSide(0),HasTaken(0)
{
FaceBmp.SetWindow(Window);
FaceBmp.Load(BmpFile);
assert(FaceBmp.GetStatus() == BitMapOkay);
BackBmp.SetWindow(Window);
BackBmp.Load("s0.bmp");


}
int Card::GetCardValue()
{
return CardValue;
}
DesignAndColor Card::GetCardDesignAndColor()
{
return CardDesignAndColor;
}
void Card::Draw()
{
if(IsFaceSide)
FaceBmp.Draw();
else
BackBmp.Draw();
return;
}
void Card::SetPosition(const Position&p)
{
FaceBmp.SetPosition(p);
BackBmp.SetPosition(p);
return;
}
void Card::EraseCard()
{
FaceBmp.Erase();
return;
}
void Card::TurnCard()
{
if(IsFaceSide)
{
BackBmp.Draw();
IsFaceSide=0;
}
else
{
FaceBmp.Draw();
IsFaceSide=1;
}

return;
}
bool Card::IsHited(const Position &p)
{
if(FaceBmp.IsInside(p)&&BackBmp.IsInside(p))
{
return 1;
}
else
return 0;

}
SimpleWindow Card::GetWindow()
{
return Window;
}

下面是Card.h
#ifndef CARD_H
#define CARD_H

#include <cassert>
#include <bitmap>

enum DesignAndColor {Hearts,Spade,Club,Piece};
class Card
{
public:
Card(string BmpFile,int Value, DesignAndColor CardDesign,SimpleWindow &W);
int GetCardValue();
DesignAndColor GetCardDesignAndColor();
void Draw();
void SetPosition(const Position &p);
void TurnCard();
void EraseCard();
bool IsHited(const Position &p);
SimpleWindow GetWindow();
private:
int CardValue;
DesignAndColor CardDesignAndColor;
Position CardPositon;
BitMap FaceBmp;
BitMap BackBmp;
SimpleWindow &Window;
bool IsFaceSide;
bool HasTaken;
};

#endif
...全文
78 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Easych 2004-05-07
  • 打赏
  • 举报
回复
其实把它置NUll更安全,不置的话也不应该出错,问题不是这里,可能是Card类本身有毛病吧,把它强制null以后就出错了,把card换成Abit(另一个相似的类),就没什么问题,
这个我调试过了
cngdzhang 2004-05-06
  • 打赏
  • 举报
回复
没理由的呀

int MouseEvent(const Position &p)
{
if(pcard && pcard->IsHited(p)) //这里由短路算法 先判断pcard是否是 NULL的,如果是 NULL 则,条件为假,这段代码是不执行的呀
{
delete pcard;

pcard=NULL;

cout<<"has delete"<<endl;

}
return 1;

}

那么,在pcard变成NULL后,再次执行的就变成了:

int MouseEvent(const Position &p)
{

return 1;

}

应该什么问题都没有才对啊

Wolf0403 2004-05-06
  • 打赏
  • 举报
回复
delete pcard 之后需要解除这个关联的事件
myWindow->SetMouseClickCallback(MouseEvent);
有没有 ->ReleaseCallback 之类的东西?
bestlink 2004-05-06
  • 打赏
  • 举报
回复
ding
Easych 2004-05-06
  • 打赏
  • 举报
回复
我适过了,虽然不响应了,但windows报错,问题不在这里,按理说,即使不置为null,delete后,也不应该在相应了,,我用另外一个相似的类Abit就没有问题,他们之间也没什么差别,不知道问题在哪里,把Card换成Abit就行,不知道怎么回事


这里有Abit的实现,
Abit.h

#ifndef ABIT
#define ABIT
#include <cassert>
#include <bitmap>
#include <randint>
#include<iostream>
class Abit
{
public:
Abit(SimpleWindow &p,Position position);

bool IsHited(const Position &p);
SimpleWindow& GetWindow();
void Draw();
private:
BitMap Bmp;
BitMap Bmp1;
SimpleWindow &W;
};
#endif


Abit.cpp
#include"Abit.h"
Abit::Abit(SimpleWindow &wi,Position p):W(wi)
{

Bmp.SetWindow(W);
Bmp.Load("c1.bmp");
Bmp.SetPosition(p);
Bmp1.SetWindow(W);
Bmp1.Load("s0.bmp");

Bmp.Draw();
}

bool Abit::IsHited(const Position &p)
{
if(Bmp.IsInside(p))
{
return 1;
}
else
return 0;
}
SimpleWindow& Abit::GetWindow()
{
return W;
}
void Abit::Draw()
{
Bmp1.Draw();
return;
}

不过还是非常感谢cngdzhang()
cngdzhang 2004-05-06
  • 打赏
  • 举报
回复
你把一个pcard , delete后它指向的内存区是释放了,但是pcard没有置为NULL的,

以下代码

int MouseEvent(const Position &p)
{
if(pcard->IsHited(p))
{
delete pcard; //就是这里,单击之后,它没被删除,下次还响应
//什么原因????
cout<<"has delete"<<endl;//这个信息每次都输出

}
return 1;

}


改为:


int MouseEvent(const Position &p)
{
if(pcard && pcard->IsHited(p))
{
delete pcard;

pcard=NULL;

cout<<"has delete"<<endl;

}
return 1;

}

应该没问题了


64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧