2012-05-20 1 views
0

У меня была проблема с ошибкой незаконного доступа, и я удалил конструктор по умолчанию из 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; 
} 
+1

Когда создается «Player», ему передается указатель на 'CGame'. Знаем ли мы, что этот указатель всегда действителен? –

+1

Безпараметрический конструктор 'CPlayer()' выглядит фиктивным. Если вы когда-либо называете это, тогда 'game' не будет назначаться. –

+0

Хмм, я думаю, моя проблема в том, что я не могу назвать CPlayer * player, потому что есть 2 конструктора. Мне нужно использовать другой конструктор CPlayer :: CPlayer (Point pos, CGame * game), чтобы он работал. Я не знаю, правильно ли я рассуждаю. –

ответ

0

В настоящее время вы объявили player в качестве функции члена не переменного члена, поэтому вы получаете сообщение об ошибке странного. Вы не можете смешивать объявление и инициализацию переменных-членов, подобных этому.

Вы декларация должна быть просто

CPlayer player; 

Но ваш конструктор CLevel должен инициализировать его, например, как:

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

Проблема с этим, однако, что в настоящее время CLevel не имеет game для инициализации игрока. Возможно, вы могли бы передать game конструктору CLevel?

Я думаю, вам нужно еще раз изучить конструкторы и инициализацию членов.