C ++对绑定成员函数的非法操作

时间:2012-05-20 10:09:21

标签: c++ access-violation

我遇到了非法访问错误的问题,我从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;
}

1 个答案:

答案 0 :(得分:0)

目前您已将player声明为成员函数而不是成员变量,这就是您收到奇怪错误消息的原因。你不能混合声明和成员变量的初始化。

您的声明应该是

CPlayer player;

但是你的CLevel构造函数需要初始化它,例如:

CLevel() : player(Point(0, 0), game) { }

但问题是,目前CLevel没有game初始化播放器。也许你可以将game传递给CLevel的构造函数?

我认为你需要更多地阅读构造函数和成员初始化。