0
//main.cpp

#include "Monsters.h"
#include "Hero.h"
#include "Monsters.h"
#include "Characters.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{

オブジェクトを作成したときに、それらのパラメーターを取得して初期化しましたか? では、なぜ彼らのメソッドを呼び出したときに、別の値が返されたのでしょうか? たとえば、オブジェクトを同時に作成しながら、ここでそれらを初期化しました。

    Hero Me(100,20,30,40);
    Monsters m(100,16,18,20);//creates a monster object and uses overloaded constructor to initialize

    Me.getHp();//expected 100, but got a long negative random number
    m.getHp();//expected 100, but got a long negative random number also

    //Why must i use setHp() and setAttack() when i already initialized them with the constructor?
    Me.setAttack(89);
    Me.setHp(100);

    m.setAttack(40);
    m.setHp(100);


    cout << "\nAttacking!\n";

    while ((Me.getHp() > 0) && (m.getHp() > 0))
    {   
        cout << "\nYour hp is: " << Me.getHp() << endl;
        cout << "The enemy's hp is: "<< m.getHp() << endl;
        cout << "\nThe monster has attacked you!\n";
        cout << "You received " << m.getAttack() << " damage;" << endl;
        Me.damageTaken(m.getAttack());
        if(Me.getHp() > 0)//Check if still alive
        {
            cout << "\nYour hp is now: " << Me.getHp() << endl;
            //cout << "Enemy hp is: "<< m.getHp() << endl;
            cout << "\nNow you attacked!\nYou have dealt "<< Me.getAttack() << " Damage" << endl;
            m.damageTaken(Me.getAttack());

            if(m.getHp() > 0)//Check if still alive
            {
                cout << "Enemy hp is now: " << m.getHp() << endl;
                cout << "\nAttacking again!\n";
            }
        }

    } 
        if ((Me.getHp() > 0) && (m.getHp() <= 0))
                cout <<"\nCongratulations! You killed the enemy!" << endl;

        else if ((Me.getHp() <= 0) && (m.getHp() > 0))
                cout << "You have died!" << endl;




    cin.sync();
    cin.get();
    return 0;
}

必要な場合に備えて、残りのコードを次に示します。

//Hero.h
#pragma once
#include "Characters.h"

class Hero:
    public Characters
{
private:
    int Herolevel;
    int HeroHp;
    int HeroStrength;
    int HeroAttack;
    int HeroDefense;

public:
    //Hero();
    Hero(int, int, int, int);
    ~Hero();

};

//Hero.cpp
#include "Monsters.h"
#include "Hero.h"
#include "Characters.h"
#include <iostream>
using namespace std;

//Hero::Hero()
//{
//  cout << "HOLA! Hero Created using normal constructor\n";
//}

Hero::Hero(int newHp, int newLevel, int newAttack, int newDef)
    : HeroHp(newHp), Herolevel(newLevel), HeroAttack(newAttack), HeroDefense(newDef)
{
    cout << "Hero created using Overloaded function!\n";
    HeroHp = newHp;
    cout << "Hp is: "<< HeroHp << endl;
    Herolevel = newLevel;
    cout << "level is: " << Herolevel << endl;
    HeroAttack = newAttack;
    cout << "Attack is: " << HeroAttack << endl;
    HeroDefense = newDef;
    cout << "Defense is: " << HeroDefense << endl;
}


Hero::~Hero()
{
    cout << "Hero destroyed!\n";
}

//Monsters.h
#pragma once
#include "Characters.h"
class Monsters:
    public Characters //Hero
{
private:
    int Monsterlevel;
    int MonsterHp;
    int MonsterStrength;
    int MonsterAttack;
    int MonsterDefense;
public:
    //Monsters();
    Monsters(int, int, int, int);
    //Monsters(int);
    ~Monsters();
};

//Monsters.cpp
#include "Monsters.h"
#include "Hero.h"
#include "Characters.h"
#include <iostream>
using namespace std;

Monsters::Monsters(int newHp, int newLevel, int newAttack, int newDef)
    : MonsterHp(newHp), Monsterlevel(newLevel), MonsterAttack(newAttack), MonsterDefense(newDef)
{
    cout << "Monster created using Overloaded function!\n";
    MonsterHp = newHp;
    cout << "Hp is: "<< MonsterHp << endl;
    Monsterlevel = newLevel;
    cout << "level is: " << Monsterlevel << endl;
    MonsterAttack = newAttack;
    cout << "Attack is: " << MonsterAttack << endl;
    MonsterDefense = newDef;
    cout << "Defense is: " << MonsterDefense << endl;
}

Monsters::~Monsters()
{
    cout << "\nMonster Destroyed";
}

//Characters.h
#pragma once
class Characters
{
private:
    int level;
    int Hp;
    int Strength;
    int Attack;
    int Defense;
public:
    Characters();
    Characters(int);
    Characters(int, int, int, int);
    ~Characters();


    int getAttack();
    int getDefense();
    int getStrength();
    int getHp();
    int getLevel();

    void setAttack(int);
    void setDefense(int);
    void setStrength(int);
    void setHp(int);
    void setlevel(int);
    void damageTaken(int);
};

//Characters.cpp
#include "Characters.h"
#include "Hero.h"
#include "Monsters.h"
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;


Characters::Characters()
{
    cout << "\nCharacter has been created!\n";

}

Characters::Characters(int random)
{
    cout << "Level " << level << " character created with: \n";
    srand ((unsigned)time(0));
    random = rand() % 10 + 1;
    //setlevel(int random);
    level = random;

}

Characters::~Characters()
{
    cout << "Character has been destroyed!\n";
}

void Characters::setAttack(int att)//get Character left over hp
    {
        Attack = att;
    }

void Characters::setDefense(int def)//get Character left over hp
    {
        Defense = def;
    }

void Characters::setStrength(int str)//get Character left over hp
    {
        Strength = str;
    }

void Characters::setHp(int health)//get Character left over hp
    {
        Hp = health;
    }

void Characters::damageTaken(int damage)//get Character left over hp
    {
        Hp -= damage;
    }

void Characters::setlevel(int lvl)//get Character left over hp
    {
        level = lvl;
    }


int Characters::getAttack()
{
    //cout << "Your attack is: " << Attack << endl;
    return Attack;
}

int Characters::getDefense()
{
    //cout << "Your defense is: " << Defense << endl;
    return Defense;
}

int Characters::getStrength()
{
    //cout << "Your strength is: " << Strength << endl;
    return Strength;
}

int Characters::getHp()
{
    //cout << "Your hp is: " << Hp << endl;
    return Hp;
}

int Characters::getLevel()
{
    //cout << "Your level is: " << level << endl;
    return level;
}
4

2 に答える 2

1

HeroCharactersすべてのデータ メンバー (level、hp など) を含むinherits 。

そのため、独自の HeroLevel や HeroHP などを追加する必要はありません。データを複製する (そして作業する) だけです。

現在、基本クラスのメンバーも初期化Charactersされていません。デフォルトのコンストラクターはそれらをゼロにしないため、それらの値は未定義です。

次のようなものを探しているはずです。

class Characters
{
private:
    int level;
    int hp;
    int strength;
    int attack;
    int defense;
protected:
    Characters(); // zero everything by default
    Characters(int); // randomly generate everything
    Characters(int, int, int, int); // populate explicitly
public:
    int getAttack() const { return Attack; }
    // etc.
};

Characters::Characters() : level(0), hp(0), strength(0), attack(0), defense(0) {}
Characters::Characters(int seed) {
    // NB. your code still doesn't initialize hp, strength etc.
    // it also logs level before initializing it, so that will be garbage
}
Characters::Characters(int hit, int lvl, int att, int def)
 : level(lvl), hp(hit), attack(att), defense(def)
{
    // you only pass 4 attributes, what should strength be?
}

そして最後に:

Hero::Hero(int newHp, int newLevel, int newAttack, int newDef)
    : Characters(newHp, newLevel, newAttack, newDef)
{
    // logging goes here
    // note that you don't need HeroLevel etc. at all any more, just use level
}

クラス階層全体を設計する前に、この基本を理解しようとする必要があります。明確な例については、juanchopanza の回答を参照してください。例を小さくすると、貼り付け、読み取り、理解がはるかに簡単になります。

于 2013-06-14T15:10:05.207 に答える
1

クラスのインスタンスを初期化する方法は?

コンストラクターを呼び出して関連する引数を渡すことにより、基本クラスを正しく初期化する必要があります。単純な例でこれを説明する方が簡単かもしれません:

class Foo
{
 public:
  explicit Foo(int i) : foo_i(i) {}
  int getFoo() const { return foo_i; }
 private:
};

class Bar : public Foo
{
 public:
  explicit Bar(int i) : Foo(i) // calls Foo(int) constructor, setting Foo::foo_i 
  {}
};

#include <iostream>
int main()
{
  Bar b(42);
  b.getFoo(); // prints 42
}
于 2013-06-14T15:10:39.817 に答える