2013-06-22 3 views
1

나는 생성자를 초기화하려고 시도한 모든 것을 시도하여 객체를 만들고 매개 변수를 전달할 때 미묘한 음수를주지는 못하지만 여전히 그렇지 않습니다. 일!다른 파일을 사용하여 오버로드 된 생성자가있는 객체를 초기화하는 방법

내가 작동하는지 테스트하려면 getHp 및 공격 기능을 사용했습니다. 그래서 예를 들어, 만약 내가 영웅 안녕 (100, 200, 300, 400)라고, 그때 Hi.getHP() 여기

//main.cpp 
    int main() 
    { 
     Hero Me(100,20,30,40);//Created using overloaded constructor 
     Monsters m(100,16,18,20);//creates a monster object and uses overloaded constructor 
    to initialize 
     cout << "\ntest1\n"; 
     Me.getHp();//expecting 100 
     Me.getAttack();//expecting w.e is in parameters 

     m.getHp();//expecting 100 
     m.getAttack();//same as hero 


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

내 코드의 나머지 부분입니다 ... 그것은 100 (첫 번째 매개 변수)해야한다, 말 필요할 때를 대비하여 나는 또한 단순한 코드를 위해 헤더 등을 생략했다. Characters 클래스

//Characters.h 
    class Characters 
    { 
    private: 
     int level; 
     int hp; 
     int attack; 
     int defense; 
    protected: 
     Characters(); // zero everything by default 
     Characters(int, int, int, int); // populate explicitly 
     ~Characters(); 
    public: 
     int getAttack() const { return attack; } 
     int getDefense() const { return defense; } 
     int getHp() const { return hp; } 
     int getlevel() const { return level; } 

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

    //Characters.cpp 
    Characters::Characters() : level(0), hp(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){} 

    Hero::Hero(int newHp, int newLevel, int newAttack, int newDef) 
     : Characters(newHp, newLevel, newAttack, 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; 
     // logging goes here 
     // note that you don't need HeroLevel etc. at all any more, just use level 
    } 

    Monsters::Monsters(int newHp, int newLevel, int newAttack, int newDef) 
     : MonsterHp(newHp), Monsterlevel(newLevel), MonsterAttack(newAttack) 
    , MonsterDefense(newDef)//initialize list 
    { 
     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; 
    } 


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

    void Characters::setAttack(int att) 
     { 
      attack = att; 
     } 

    void Characters::setDefense(int def) 
     { 
      defense = def; 
     } 

    void Characters::setHp(int health) 
     { 
      hp = health; 
     } 

    void Characters::damageTaken(int damage) 
     { 
      hp -= damage; 
     } 

    void Characters::setlevel(int lvl) 
     { 
      level = lvl; 
     } 

    //Monsters.h 
    class Monsters: 
     public Characters //Hero 
    { 
    private: 
     int Monsterlevel; 
     int MonsterHp; 
     int MonsterStrength; 
     int MonsterAttack; 
     int MonsterDefense; 
    public: 
     Monsters(int, int, int, int); //explicit 
     ~Monsters(); 
    }; 

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

    //Hero.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 
    Hero::~Hero() 
    { 
     cout << "Hero destroyed!\n"; 
    } 

답변

0

Hero 클래스 HeroHphp 별도의 변수이다. Hero의 생성자는 getHp에 의해 반환되는 변수 인 hp을 결코 초기화하지 않습니다.

Hero 클래스의 HeroXXX 변수를 제거하고 Characters 기본 클래스의 해당 변수를 사용하는 것이 좋습니다.

+0

나는 시도했다. 그러나 그것은 문자 클래스의 변수에 접근 할 수 없다고 말한다. – Damian

+0

그들은 비공개이기 때문에. 이를 보호하고 파생 클래스가 액세스 할 수있게하십시오. –

0

그것은 내가 문자 생성자의 주석을 해제하면 잘 작동 :

http://coliru.stacked-crooked.com/view?id=261944b9b1304c3ed9d76e69b2318ee2-ad7854d9cfd7979d567ca413f0830b65 당신이 성공을 컴파일하고 확신을? 그 주위에 몇 가지 경고를 남겨 두었을 수도 있습니다 ... 항상 항상 경고를 모두 제거해야합니다.

+0

하지만 왜 그래도? 영웅과 몬스터가 모두 "캐릭터"이기 때문에 캐릭터 생성자가 필요하지 않습니까? – Damian

+0

@BigD ** un ** - 코드에서 주석 처리 된 Character 생성자에 주석 처리했습니다. – Antonio

+0

네,하지만 여전히 예상 결과를 얻지 못했습니다 : ( – Damian

관련 문제