我遇到了非法访问错误的问题,我从Player.h中删除了默认构造函数,因为我推断出问题是由于它造成的。我现在遇到的问题是Level.cpp想要一个默认的构造函数,所以我编辑了Level.h文件,如图所示。这个问题已经解决,但现在我无法返回指向播放器的指针。显示错误'对绑定成员函数的非法操作'。有什么想法吗?我是C ++的初学者,任何帮助都会受到赞赏。
Player.h:
#ifndef _TAG_PLAYER
#define _TAG_PLAYER
#pragma once
#include "Tile.h"
#include "Point.h"
class CGame;
class CPlayer : public CTile
{
public:
CPlayer(Point pos, CGame* game);
~CPlayer();
char getDisplay() ;
virtual bool canMove(const Direction direction, Point p) ;
virtual void move(const Direction direction, Point p);
bool CheckForHome() ;
};
#endif _TAG_PLAYER
Player.cpp:
#include "Box.h"
#include "Level.h"
#include "Tile.h"
CPlayer::CPlayer(Point pos, CGame* game)
{
this->game=game;
Point p;
p.x=0;
p.y=0;
setPosition(p);
}
CPlayer::~CPlayer()
{
}
bool CPlayer::CheckForHome() {
Point p = getPosition();
bool OnHomeTile;
if(game->getLevel()->getTiles()[p.y][ p.x] == GOAL)
{
OnHomeTile = true;
} else {
OnHomeTile = false;
}
return OnHomeTile;
}
char CPlayer::getDisplay()
{
if (CheckForHome())
{
return SOKOBANONGOAL_CHAR;
}
else
{
return PLAYER_CHAR;
}
}
Level.h:
#pragma once
#include "Point.h"
#include "Tile.h"
#include "Player.h"
#include "Box.h"
#include <list>
#include <string>
class CGame;
class CLevel
{
private:
list<CBox> boxes;
TileType tiles[GRID_HEIGHT][GRID_WIDTH];
CPlayer player(Point p, CGame* game); -> new declaration
//CPlayer player; -> old declaration
protected:
CGame* game;
public:
CLevel();
~CLevel();
CPlayer* getPlayer();
list<CBox>* getBoxes();
TileType (*getTiles())[GRID_WIDTH];
};
Level.cpp的构造函数
CLevel::CLevel()
{
this->game=game;
Point p;
p.x=0;
p.y=0;
player(p,game);
memset(tiles, GROUND, sizeof(TileType)*GRID_HEIGHT*GRID_WIDTH);
}
Level.cpp中出现错误的函数:
CPlayer* CLevel::getPlayer()
{
return &player;
}
答案 0 :(得分:0)
目前您已将player
声明为成员函数而不是成员变量,这就是您收到奇怪错误消息的原因。你不能混合声明和成员变量的初始化。
您的声明应该是
CPlayer player;
但是你的CLevel构造函数需要初始化它,例如:
CLevel() : player(Point(0, 0), game) { }
但问题是,目前CLevel
没有game
初始化播放器。也许你可以将game
传递给CLevel
的构造函数?
我认为你需要更多地阅读构造函数和成员初始化。