0

不正なアクセスエラーに問題があり、問題の原因であると推測したため、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;
}
4

1 に答える 1

0

player現在、メンバー変数ではなくメンバー関数として宣言しているため、奇妙なエラー メッセージが表示されます。このようにメンバー変数の宣言と初期化を混在させることはできません。

あなたの宣言はただあるべきです

CPlayer player;

ただし、CLevel コンストラクターは、次のように初期化する必要があります。

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

ただし、問題は、現在、プレーヤーを初期化するためCLevelの がないことです。おそらく、 のコンストラクターに をgame渡すことができますか?gameCLevel

コンストラクターとメンバーの初期化についてもう少し読む必要があると思います。

于 2012-05-20T18:56:19.327 に答える