2016-06-27 4 views
0

Я новичок на C++. У меня есть простой класс Unit и класс Hero, который унаследован от класса Unit. Класс Hero имеет 2 дополнительных параметра, но конструктор не может достичь параметров класса родителя. Вот 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; 
} 

Это консольный выход ut:

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) 
    ^

В чем проблема? Извините за плохой английский. Надеюсь, я задал вопрос правильно, так много новых терминов для меня. Заранее спасибо.

+0

Вы хотите вызвать конструктор базового класса из списка инициализации или вы можете получить доступ к этим элементам в теле производного конструктора. –

+0

Если вы хотите использовать тип данных * экономии пространства *, вы должны использовать типы 'uint # _t', такие как' uint8_t' и 'uint16_t'. Эти типы имеют гарантированный размер. Гарантируется, что тип 'short' имеет как минимум заданный диапазон; он мог бы поддерживать больше. Например, 32-разрядное целое можно использовать как «короткий» и все еще быть в пределах правил языка. –

ответ

0

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; 
} 

Кроме того, у вас есть член под названием «имя» в обоих группы и героя, вы не можете избавиться, или переименовать один из них.

+0

Да, этот рабочий. Спасибо! – SuperPrower

0

Инициализируйте элементы Unit в конструкторе Unit (возможно, защищенном, если вы хотите, чтобы он был вызван от Hero) и члены Hero в Hero. Вот как работают списки инициализаторов. Кроме того, вы можете включить их между фигурными скобками героя, но это не рекомендуется.

3

Ваш базовый класс должен нести ответственность за инициализацию своих переменных обычно через конструктор .

Это:

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. 
+0

BTW, нет необходимости использовать тип данных 'short', если вы не находитесь в системе с ограниченной памятью. Тип 'int' обычно является типом, который является размером регистров процессора или слова. Таким образом, на 32-битной платформе размер регистра процессора обычно составляет 32 бита. Нет существенной экономии пространства или эффективности с использованием меньших по размеру переменных (кроме символов). –

+0

Благодарим вас за советы! Я использую short только потому, что моя система - x64, и я хотел бы ограничить максимальное количество работоспособности, поэтому она не пройдет более 9000 :) Кроме того, я удалил дубликаты. – SuperPrower

+0

Если этот ответ был полезен, нажмите на галочку. –

0

Что вы пытаетесь сделать в конструкторе 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), 
    {} 

Обратите внимание, что на этот раз, группа() не называется здесь вообще - только другой contsructor это - явно.

Смежные вопросы