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;