【问题标题】:Inheritance understanding access denied for a derived class派生类的继承理解访问被拒绝
【发布时间】: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


【解决方案1】:

让我们从你的构造函数中提取这两行:

E_Damage = new float;
E_Damage = nullptr;

首先你分配一个float,并让E_Damage指向它。然后您立即将E_Damage 设为空指针,因此它不再指向任何有效的地方。这会导致内存泄漏。

稍后您使用这个空指针,这会导致未定义的行为和可能的崩溃。

对于单个值,很少需要使用指针,尤其是在这种情况下。只需将E_Damage(和其他成员变量)声明为普通的非指针变量。

【讨论】:

    猜你喜欢
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    相关资源
    最近更新 更多