从继承的类访问指针对象时,C ++“无法读取内存”

时间:2015-12-08 18:45:31

标签: c++ pointers object inheritance

我有这个错误:

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?

让图片更清晰的图片:

http://prntscr.com/9btfim

编辑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;
}

1 个答案:

答案 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;