switch-case语句里不能使用类的静态变量吗?

lq1115 2016-04-07 11:40:57
我最近在写一个吃豆子的小游戏,结果我声明的一个类静态指针static GMap* pStage在bool Collision()函数中报错,而在其他函数如:PtTransform()中使用却没有问题
这是报错信息
GObject.obj : error LNK2001: unresolved external symbol "public: static class GMap * GObject::pStage" (?pStage@GObject@@2PAVGMap@@A)
Debug/Game.exe : fatal error LNK1120: 1 unresolved externals
一下是源码
//////////////////////////////

#include "stdafx.h"
#include "GMap.h"
enum TW{UP,DOWN,LEFT,RIGHT,OVER};
class GObject
{
protected:
POINT point;
TW tw;
int speed;
int frame;
int dArray;
int dRow;
bool Achive();
void AchiveCtrl();
int PtTransform(int k);
bool Collision();
public:
void virtual action()=0;
void virtual Draw(HDC &hdc)=0;
void DrawBlank(HDC &hdc);
static GMap* pStage;
GObject(int x,int y)
{
point.x=x;
point.y=y;
speed=3;
frame=1;
}
};
class PacMan:public GObject
{
public:
void Draw(HDC &hdc);
void action();
PacMan(int x,int y):GObject(x,y)
{
}
};
int GObject::PtTransform(int k)
{
return (k-(pStage->LD)/2)/pStage->LD;
}
void GObject::AchiveCtrl()
{
if(Achive())
{
dArray=PtTransform(point.x);
dRow=PtTransform(point.y);
}
}
bool GObject::Collision()
{
bool b=true;
AchiveCtrl();
if(dArray<0||dRow<0||dArray>MAPLENTH||dRow>MAPLENTH)
{
b=false;
}
if(Achive())
{

switch(tw)
{
case LEFT:
{
if(dArray>0&&pStage->mapData[dRow][dArray-1])
{
b=false;
}
break;
}
case RIGHT:
{
if(dArray<MAPLENTH-1&&pStage->mapData[dRow][dArray+1])
b=false;
break;
}
case UP:
{
if(dRow>0&&pStage->mapData[dRow-1][dArray])
b=false;
break;
}
case DOWN:
{
if(dRow<MAPLENTH&&pStage->mapData[dRow+1][dArray])
b=false;
break;
}
}
if(b)
{
switch(tw)
{
case LEFT:
point.x-=speed;
break;
case RIGHT:
point.x+=speed;
break;
case UP:
point.y-=speed;
break;
case DOWN:
point.y+=speed;
break;
}
}
}
return b;
}
...全文
979 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-04-08
  • 打赏
  • 举报
回复
引用 7 楼 lq1115 的回复:
[quote=引用 6 楼 paschen 的回复:] 静态成员需要初始化,和你switch-case无关
引用 6 楼 paschen 的回复:
静态成员需要初始化,和你switch-case无关
我在winmain函数里初始化了,可是还是不行怎么办?[/quote] 不是在WINMAIN里,是在外面,1楼已经给你例子了
山巅客 2016-04-07
  • 打赏
  • 举报
回复
引用 1 楼 paschen的回复:
class GObject { //.......... }; GMap* GObject::pStage = NULL; //加上这 一句
是没有初始化的问题吗?
lq1115 2016-04-07
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
class GObject { //.......... }; GMap* GObject::pStage = NULL; //加上这 一句
没有用啊
paschen 版主 2016-04-07
  • 打赏
  • 举报
回复
class GObject { //.......... }; GMap* GObject::pStage = NULL; //加上这 一句
lq1115 2016-04-07
  • 打赏
  • 举报
回复
引用 6 楼 paschen 的回复:
静态成员需要初始化,和你switch-case无关
引用 6 楼 paschen 的回复:
静态成员需要初始化,和你switch-case无关
我在winmain函数里初始化了,可是还是不行怎么办?
paschen 版主 2016-04-07
  • 打赏
  • 举报
回复
静态成员需要初始化,和你switch-case无关
lq1115 2016-04-07
  • 打赏
  • 举报
回复
引用 4 楼 renwotao2009 的回复:
GMap的源文件有没有编译
编译了
renwotao2009 2016-04-07
  • 打赏
  • 举报
回复
GMap的源文件有没有编译

64,685

社区成员

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

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