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

C++ C++“;无法读取内存”;从继承的类访问指针对象时,c++,pointers,object,inheritance,C++,Pointers,Object,Inheritance,我有一个错误: Exception thrown at 0x0108C6E9 in myprojectname.exe: 0xC0000005: Access violation reading location 0x00000028. 但是,只有在通过派生类从基类调用函数时才会发生这种情况 我需要一个指向空间对象的指针,因为我的基类也需要它。我不确定是否需要这样做 以下是我如何调用基本(玩家)类的函数: 错误消息“无法读取内存”发生在基类需要的类(例如指向窗口的指针)的getter函数中 有

我有一个错误:

Exception thrown at 0x0108C6E9 in myprojectname.exe: 0xC0000005: Access violation reading location 0x00000028.
但是,只有在通过派生类从基类调用函数时才会发生这种情况

我需要一个指向空间对象的指针,因为我的基类也需要它。我不确定是否需要这样做

以下是我如何调用基本(玩家)类的函数:

错误消息“无法读取内存”发生在基类需要的类(例如指向窗口的指针)的getter函数中

有人知道我做错了什么吗

在我的项目的每个类中,我初始化指向名为space的导入类的空间指针。如果我不调用敌方类继承的东西,这个程序可以很好地处理这些空间指针

编辑:

我发现(非常重要的)空间类的对象在基类中为NULL。敌方类空间对象不为空,但其继承类的空间对象为空。有人知道继承的指针对象如何为NULL吗

更清晰的图片:

编辑2我的当前代码:

h(派生类)

敌方

#include "Space.h"
#include "Enemy.h"
#include "Player.h"
#include <iostream>

void Enemy::updateEnemy(){
    if (space == nullptr) {
        std::cout << "null"; //IT PRINTS NULL
    }
}
player.cpp的一部分

void Player::init(Space * s){ //INITIALIZING SPACE CLASS OBJECT
    space = s;
}

你的玩家对象和敌人对象都声明为

Space * space;
所以
敌方::空格
隐藏
玩家::空格
所以当你初始化
敌方::空格
时,
玩家::空格
保持为零

敌人
类中声明另一个
空格*空格
几乎肯定是错误的。您应该使用
Player
类中的一个。我想
Player
类中的那个是
private
,所以你不能使用它。但再有一个并不能解决这个问题。将其从
private
更改为
protected
或通过访问器函数进行所有访问

编辑:Wild guess,您需要一个
Space*Space
Player
类的所有实例共享。为此:在
Player
的定义中,您有:

static Space * space;
播放器定义之外的其他地方(在某些cpp文件中),您需要:

Space* Player::space;

所以我必须去掉这个空间;从敌人的职业中移除?从敌人的职业中移除,让敌人可以访问玩家中的职业。你记得重新编译吗?它还将有助于发布代码的相关部分,而不是让我们从调试器监视窗口中的数据推断代码。但是,由于你在那个监视窗口中发布的内容很好地突出了这个问题,并且你理论上已经修复了该窗口现在是什么样子?我检查了它,并且从敌方(派生)类访问的Player类中的space对象是nullptr。尝试-将“this”指针的std::cout添加到这两个类的ctor中。然后找出为什么一个是空的。(未调用ctor?)请编辑您的问题以显示正确的当前代码。您发布的内容已注释掉
space
行,但调试器输出显示它们未注释掉。那么你的评论(关于我的答案)意味着你删除了其中一行被注释掉的内容,而另一行不起作用。你让我对你实际测试的内容猜得太多了。@JSF我用当前代码编辑了我的问题。但是你没有更新调试显示,它仍然显示
空格的两个副本,其中只有一个是零。假设现在只有一个副本,而它是零,那么为什么不调用
Player::init
来调用
敌人
。你是否也有一个
敌方::init
隐藏它,并且缺少调用隐藏基类函数的惯用用法?@JSF否,因为我认为敌方类会继承Player类,包括指向空间类的指针对象。因此你似乎在说你没有犯定义错误的
敌方::init
函数的错误。那么代码中的哪一点应该为敌人对象调用
Player::init
,为什么不起作用?(您仍然忽略了关键的细节)。
Space * space;
static Space * space;
Space* Player::space;