C++在访问第二个派生类变量时的多重继承问题

问题描述 投票:0回答:1

我有一个基类A,在这个类中,有一个派生类B的向量,我把类C对象添加到这个列表中(C是B的一个派生类)。但是现在我无论是从B还是C中都无法访问任何变量。

我的类结构是这样的。

enter image description here

Skill.h

class Skill
{

public:

    Skill()
    {

    }

    vector <AttackSkill*> attacks;
    vector <UtilitySkill*> utilities;
    vector <MoveSkill*> movement;

};

攻击技能.h

#pragma once
#include "Skill.h"

class AttackSkill :
    public Skill
{

public:

    AttackSkill()
    {

    }

    string skillName;       
    int dmgMod;
    int baseAcc;

};

其中一个技能

#pragma once
#include "AttackSkill.h"

class Axeblade :
    public AttackSkill
{
public:
    Axeblade()
    {
        skillName = "Axeblade";     
        dmgMod = 0;
        baseAcc = 72;
    }

};

这是新技能的添加方法

attacks.push_back(new Axeblade);

我只是想能够访问变量。

例如:"skillPtr "是指向Skill对象的指针。

"skillPtr "是指向Skill对象的指针。

for (int i = 0; i < skillPtr->attacks.size(); i++) //No problem here
{
    cout << "Skill " << i << ") " << skillPtr->attacks[i]->skillName << endl;
}

错误C2039 'skillName': 不是'Skill'的成员。

c++ pointers
1个回答
0
投票

我在这里做了一些猜测,因为问题并不完全具体,但它可能会有帮助......

您的 class Skill 包含三个向量(聚合),它被定义技能类型的子类继承(继承)。你应该把这两个原则分解开来。应该有一个类包含一个角色的向量,让我把它叫做 SkillSet. 对了,你应该 不发 using namespace 在头文件中.)

class SkillSet
{
public:
    std::vector <AttackSkill *> attacks;
    std::vector <UtilitySkill *> utilities;
    std::vector <MoveSkill *> movement;
};

然后就会有 另一个 所有技能的基类,它将包含所有技能的属性。

class Skill
{
public:
    std::string skillName;       
};

然后你可以继承这个新的 Skill 类。

class AttackSkill :
    public Skill
{

public:
    int dmgMod;
    int baseAcc;
};

class Axeblade :
    public AttackSkill
{
public:
    Axeblade()
    {
        skillName = "Axeblade";     
        dmgMod = 0;
        baseAcc = 72;
    }
};

在创建和填充一个 SkillSet 对象。

SkillSet hero0;
hero0.attacks.push_back(new Axeblade);

你可以简单地访问它的公共成员。

std::cout << hero0.attacks[0]->skillName;

参见 我的代码示例.

还有一些注意事项需要考虑。

  • 你不需要指针的向量,你可以直接把对象放到向量里。向量不是一个普通的数组。
  • 与其将属性公开,不如考虑使用 设置器和获取器.
  • 你的代码中包含空的构造函数。没有必要写一个空的构造函数。
  • 另一方面,如果你的代码中包含了用 new,你应该 delete 例如,在destructor中。
© www.soinside.com 2019 - 2024. All rights reserved.