2016-06-27 12 views
0

私はC++の初心者です。私は単純なユニットクラスと英雄クラスを持ち、ユニットクラスを継承しています。ヒーロークラスには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さ:

:、ここhero.cppは

#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 

とfinalyです

#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

* space savings *データ型を使用する場合は、 'uint8_t'や' uint16_t'のような 'uint#_t'型を使うべきです。これらのタイプは保証サイズです。 'short'型は少なくとも与えられた範囲を持つことが保証されています。より大きなものをサポートすることができます。例えば、32ビットの整数は 'short'として使用することができ、依然として言語の規則の範囲内にあります。 –

答えて

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

ユニットのコンストラクタ内のユニットのメンバーを初期化します(あなたがヒーローから呼び出されたい場合は保護されている可能性があります)。これがイニシャライザのリストの仕組みです。あるいは、Heroのctorの中括弧の中にそれらを初期化することもできますが、これはお勧めしません。

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変数、あなたがtruefalseを使用すべきではなく、数字で。

編集1:
あなたの子クラスが基底クラスと同じ変数名を避ける必要があり、重複メンバー名。

ヒーローの行:

string name; 

影または基本クラスのメンバを非表示にします。

string name; 

あなたはこの規則を維持することを好む場合は、スコープ解決演算子::を使用する必要がありますあなたが参照しているメンバーをコンパイラに伝える:

Hero::name = "Hercules"; // Assign member in Hero class 
Unit::name = "Person"; // Assign to member in Unit class. 
+0

ところで、あなたがメモリが制約されているシステムでない限り、 'short'データ型を使う必要はありません。 'int'型は通常、プロセッサのレジスタまたはワードのサイズである型です。したがって、32ビットプラットフォームでは、プロセッサのレジスタサイズは通常32ビットです。サイズの小さい変数(文字を除く)を使用することで、大幅な領域節約や効率化はありません。 –

+0

アドバイスをいただきありがとうございます!私のシステムがx64であり、最大限の健康を制限したいので、私は短くします。それは9000を超えません:)また、私は重複を削除しました。 – SuperPrower

+0

この回答が参考になった場合は、チェックマークをクリックしてください。 –

0

Hero.cppコンストラクタで何をしようとしているのは、基本クラスのメンバーを初期化することです。ベースクラスそのものの仕事のように凄く聞こえるよ!実際、セミコロンに達すると、基本クラスのコンストラクタ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です - 明示。

関連する問題