无法访问构造函数中类的继承成员
Can't access inherited members of class in constructor
我是c++新手。我有简单的Unit类和hero类,后者继承自Unit类。英雄类有两个额外的参数,但是构造函数不能到达父类的参数。这里是unit.hpp:
#ifndef UNIT_HPP
#define UNIT_HPP
#include <string>
using namespace std;
class Unit
{
public:
unsigned short max_health = 100;
string name = "Dummy";
short health = 100;
short damage = 10;
bool isDead = 0;
Unit();
Unit(string, unsigned short, unsigned short);
};
#endif //UNIT_HPP
这里是unit.cpp:
#include <string>
#include <iostream>
#include "unit.hpp"
using namespace std;
Unit::Unit()
{
cout << "Dummy was created!" << endl;
};
Unit::Unit(string N, unsigned short HP, unsigned short AT):
max_health(HP),
name(N),
health(HP),
damage(AT)
{
cout << N << " was created!" << endl;
};
这里是hero.hpp:
#ifndef HERO_HPP
#define HERO_HPP
#include <string>
#include "unit.hpp"
class Hero : public Unit
{
public:
unsigned short max_mana = 100;
string name = "The Brave Warrior";
short mana = 100;
Hero (string, unsigned short, unsigned short, unsigned short);
};
#endif //HERO_HPP
最后是hero.cpp:
#include <string>
#include "hero.hpp"
using namespace std;
Hero::Hero(string N, unsigned short HP, unsigned short MP, unsigned short AT):
max_health(HP),
max_mana(MP),
name(N),
health(HP),
mana(MP),
damage(AT)
{
cout << "The Legendary Hero, " << N << ", was born!" << endl;
}
控制台输出:
src/hero.cpp: In constructor ‘Hero::Hero(std::__cxx11::string, short unsigned int, short unsigned int, short unsigned int)’:
src/hero.cpp:10:5: error: class ‘Hero’ does not have any field named ‘max_health’
max_health(HP),
^
src/hero.cpp:13:5: error: class ‘Hero’ does not have any field named ‘health’
health(HP),
^
src/hero.cpp:15:5: error: class ‘Hero’ does not have any field named ‘damage’
damage(AT)
^
问题在哪里?抱歉我的英语不好。我希望我问的问题是正确的,这么多的新术语给我。提前谢谢你。
你的基类应该负责初始化它的变量,通常通过构造函数方法。
:
unsigned short max_health = 100;
string name = "Dummy";
short health = 100;
short damage = 10;
bool isDead = 0;
看起来不洁。这些成员应该在构造函数中初始化:
Unit::Unit()
: max_health(100),
name("Dummy"),
health(100),
damage(10),
isDead(false)
{ ; }
同样,对于bool
变量,您应该使用true
或false
,而不是数字。
编辑1:重复的成员名
子类应该避免使用与基类相同的变量名。
Hero:
string name;
显示或隐藏基类成员:
string name;
如果您希望保持这种惯例,您应该使用作用域解析操作符 ::
来告诉编译器您引用的是哪个成员:
Hero::name = "Hercules"; // Assign member in Hero class
Unit::name = "Person"; // Assign to member in Unit class.
c++不允许从子类的初始化器列表中初始化基类的成员。
Hero::Hero(string N, unsigned short HP, unsigned short MP, unsigned short AT):
Unit(N, HP, AT), // initializes the base class' members
max_mana(MP),
name(N),
mana(MP),
{
// but you could override the base class' members here
isDead = true;
cout << "The Legendary Hero, " << N << ", was zombified!" << endl;
}
另外,在Unit和Hero中都有一个名为'name'的成员,你可能想要删除或重命名其中一个。
在Unit的构造函数中初始化Unit的成员(如果你只希望从Hero调用它,可能是受保护的构造函数),在Hero中初始化Hero的成员。这就是初始化列表的工作方式。或者,你可以在Hero的actor的大括号之间初始化它们,但不建议这样做。
你在Hero.cpp构造函数中要做的是初始化基类的成员。这听起来非常像基类本身的工作!实际上,当到达分号时,也就是说,基类构造函数Unit()已经被调用(因此,它所包含的内容已经初始化)。因此,如果要从Unit中删除Unit(),就会得到编译错误,因为另一个构造函数有参数要接受。还有那些你需要像这样明确指定的:
Hero::Hero(string N, unsigned short HP, unsigned short MP, unsigned short AT):
Unit(HP, N, HP, AT),
max_mana(MP),
mana(MP),
{}
注意,这里根本没有调用Unit()——只有另一个构造函数被显式调用。
- 为什么我可以通过SubBase类的公共继承方法打印出基类的私人继承成员
- 派生类调用使用非继承成员的继承函数
- 如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
- C :原始成员与继承成员的优先级
- 更改继承成员的地址
- C 是否可以不继承成员
- 使用模板的继承阴影继承成员
- 继承成员功能的模板专业化
- 不允许继承成员,为什么
- 派生模板类和继承成员变量的语法谜题
- 继承成员地址的C++标准
- 多级继承成员访问
- 访问专用模板的私有/继承成员变量
- 基模板继承成员,减少所需的类型
- 继承成员函数指针
- 模板专用化类不继承成员
- C++14正在初始化类构造函数初始化列表中的继承成员
- 具有专门初始化的继承成员变量
- 模板继承成员字段
- 访问数据成员的继承成员函数