У меня была проблема с ошибкой незаконного доступа, и я удалил конструктор по умолчанию из Player.h, поскольку я понял, что проблема была из-за этого. Проблема, с которой я столкнулась сейчас, заключается в том, что Level.cpp хотел конструктор по умолчанию, поэтому я отредактировал файл Level.h, как показано. Эта проблема была решена, но теперь я не могу вернуть указатель на игрока. Отображается ошибка «незаконная операция над связанной функцией-членом». Любые идеи, пожалуйста? Я новичок в C++, и любая помощь будет оценена.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;
}
Когда создается «Player», ему передается указатель на 'CGame'. Знаем ли мы, что этот указатель всегда действителен? –
Безпараметрический конструктор 'CPlayer()' выглядит фиктивным. Если вы когда-либо называете это, тогда 'game' не будет назначаться. –
Хмм, я думаю, моя проблема в том, что я не могу назвать CPlayer * player, потому что есть 2 конструктора. Мне нужно использовать другой конструктор CPlayer :: CPlayer (Point pos, CGame * game), чтобы он работал. Я не знаю, правильно ли я рассуждаю. –