我有这个错误:
Exception thrown at 0x0108C6E9 in myprojectname.exe: 0xC0000005: Access violation reading location 0x00000028.
但是,这只发生在我通过派生类从基类调用函数时。
我需要一个指向空间对象的指针,因为我的基类也需要它。我不确定是否需要这样做。
这就是我调用base(Player)类的函数的方法:
space->getEnemy().drawPlayer(); //FIRST I GET THE OBJECT OF THE DERIVED(ENEMY CLASS) AND THAN I CALL A FUNCTION FROM THE BASE CLASS(PLAYER CLASSS)
错误消息“无法读取内存”发生在基类需要的类中的getter函数中(例如指向窗口的指针)。
有谁知道我做错了什么?
我在项目的每个类中初始化了指向我的导入类Space的空间指针。如果我不调用Enemy类的继承内容,程序可以正常使用这些空格指针。
修改
我发现(非常重要的)Space类的对象在基类中是NULL。敌人类空间对象不是NULL,但它继承的类的空间对象是NULL。有谁知道继承的指针对象如何可以为NULL?
让图片更清晰的图片:
编辑2我的当前代码:
Enemy.h(THE DERIVED CLASS)
#pragma once
class Space;
class Enemy : public Player{
public:
void updateEnemy();
private:
};
Enemy.cpp
#include "Space.h"
#include "Enemy.h"
#include "Player.h"
#include <iostream>
void Enemy::updateEnemy(){
if (space == nullptr) {
std::cout << "null"; //IT PRINTS NULL
}
}
player.h(THE BASE CLASS)的一部分
class Space; //forward declaration
public:
void init(Space * s);
protected:
Space * space;
player.cpp的一部分
void Player::init(Space * s){ //INITIALIZING SPACE CLASS OBJECT
space = s;
}
答案 0 :(得分:0)
您的Player对象和您的Enemy对象都声明了
Space * space;
因此Enemy::space
会隐藏Player::space
,因此当您初始化Enemy::space
时,Player::space
仍然为零。
在Space * space
类中声明另一个Enemy
几乎肯定是错误的。您应该使用Player
类中的那个。我希望Player
类中的那个是private
,所以你不能使用它。但是有另一个并不能解决这个问题。要么将其从private
更改为protected
,要么通过访问者函数进行所有访问。
编辑:疯狂猜测,您希望Space * space
类的所有实例共享一个Player
。要做到这一点:在Player
的定义中,你有:
static Space * space;
以及Player
定义之外的其他地方(在某些cpp文件中)您需要:
Space* Player::space;