【发布时间】:2020-07-05 20:58:11
【问题描述】:
我现在对此有点困惑,据我了解,特定的敌人继承自基敌人类,因此在创建时他们使用基敌人构造函数,创建自己的变量对象副本一起工作。所以当我使用继承的敌人的 set_E 函数时,它会设置自己的 E_Damage 和 E_Health 来使用?如果是这样,为什么它拒绝访问自己的变量?
在 Visual Basic 的 locals 选项卡中,每个 x 对象确实有自己的敌人变量,如果我尝试直接访问敌人类我会得到一个访问错误,如果我尝试使用自己的对象我也会得到这个错误,什么我做错了吗?
基础敌人类
class Enemy
{
public:
Enemy();
~Enemy();
void set_E(float, float);
float get_E_H();
float get_E_D();
virtual void Battle() = 0;
float* E_Damage;
float* E_Health;
char* E_Descrip;
float* E_Attack;
};
敌人的破坏者
Enemy::~Enemy()
{
if (E_Damage != nullptr)
{
delete E_Damage;
E_Damage = nullptr;
}
if (E_Health != nullptr)
{
delete E_Health;
E_Health = nullptr;
}
if (E_Attack != nullptr)
{
delete E_Attack;
E_Attack = nullptr;
}
if (E_Descrip != nullptr)
{
delete E_Descrip;
E_Descrip = nullptr;
}
}
敌人构造函数:
E_Damage = new float;
E_Damage = nullptr;
E_Health = new float;
E_Health = nullptr;
E_Attack = new float;
E_Attack = nullptr;
示例继承的敌人.h
class T_Rex : private Enemy, private CS_Text_Adventure
{
public:
void T_Rex::set_E(float Dmg, float Health, T_Rex x);
T_Rex();
~T_Rex();
void Battle() override;
};
继承的enemy.cpp示例
void T_Rex::Battle()
{
T_Rex x;
x.set_E(15.0f, 100.0f, x);
E_Descrip = "the passage way opens up to a tropical forrest";
std::cout << std::endl;
std::cout << x.E_Descrip << std::endl;
std::cout << std::endl;
while(*fight == true)
{
*x.E_Attack = rand() % 100 + 0;
if(*x.E_Attack >= 30)
{
*P_Health -= *x.E_Damage;
}
else if(*x.E_Attack < 30)
{
*x.E_Health -= *P_Health;
}
if(*P_Health <= 0)
{
*gamerun = false;
}
else if(*E_Health <= 0)
{
*fight = false;
}
}
step++;
}
对指针引用重新分配的未授权访问:
void T_Rex::set_E(float Dmg, float Health, T_Rex x)
{
*x.E_Damage = Dmg;
*x.E_Health = Health;
}
【问题讨论】:
-
真是一团糟。看在上帝的份上,为什么要通过 new 来创建每个变量?为什么在每个
new之后分配nullptr? -
在每个
delete之前不需要检查nullptr,因为delete无论如何都会执行检查 -
看起来您需要一本 C++ 书籍而不是任何具体建议,但如果您需要有关编译错误的帮助,您需要将完整的未经编辑的错误消息复制并粘贴到问题中。
-
@n.m.令人惊讶的是,OP 不了解基础知识并同时使用多重继承。他让所有成员在一侧公开,在另一侧使用私有继承。无价之宝。
标签: c++ inheritance project