2016-11-10 4 views
0

私はこの時点で少し不機嫌になっていますが、特定の敵は基本敵クラスを継承していますので、作成時には基本敵コンストラクタを使用して彼ら自身のオブジェクトは、作業する変数のコピーです。だから私は継承された敵のset_E関数の傷を使用するときは、それ自身のE_DamageとE_Healthを設定して使用しますか?もしそうなら、なぜそれ自身の変数へのアクセスを拒否しているのでしょうか?派生クラスの継承を拒否する継承

ビジュアルベーシックの地方のタブでは、各オブジェクトは実際に敵の変数を持っています。敵のクラスに直接アクセスしようとするとアクセスエラーが発生します。オブジェクトを使用しようとすると、私は間違って何をしていますか?

ベース敵クラス

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; 

例enemy.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++; 
} 

不正アクセスを継承:

E_Damage = new float; 
E_Damage = nullptr; 

まず:

void T_Rex::set_E(float Dmg, float Health, T_Rex x) 
{ 
*x.E_Damage = Dmg; 
*x.E_Health = Health; 
} 
+1

どのような混乱。なぜ神はあなたが新しいものを通してすべての変数を作るのですか?それぞれ 'new'の後に' nullptr'を割り当てるのはなぜですか? – Slava

+0

最初に 'delete's''がチェックを実行する前に' nullptr'をチェックする必要はありません –

+0

特定のアドバイスよりもC++の本が必要なようですが、コンパイルエラーの助けが必要な場合は、完全な未編集のエラーメッセージをコピーして質問に貼り付ける必要があります。 –

答えて

3

があなたのコンストラクタからこれらの2行を取ることができますfloatを1つ割り当ててにしてくださいを指す。その後すぐにE_Damageをヌルポインタにして、有効な場所を指していないようにします。これによりメモリリークが発生します。

このヌルポインタを使用すると、の未定義の動作が発生し、クラッシュする可能性があります。

単一の値の場合、特にこの場合はポインタを使用する必要はほとんどありません。 E_Damage(およびその他のメンバー変数)を通常の非ポインタ変数として宣言するだけです。