2012-02-12 3 views
1

Я пытался сделать простую текстовую игру покемонов в C++. Я создал класс для pokemon, а затем в моем pokemain.cpp попытался вывести hp из charmander. Когда я пытаюсь запустить pokemonmain.cpp, он говорит, что charmander не был объявлен. Я уверен, что это глупый вопрос, но я не могу найти ответ на него.От класса к .cpp

Вот мой код.

//class named stats 
#include <iostream> 
using namespace std; 

class pokemon 
{ 
    int health, damage; 

    public: 

    pokemon (int,int); 
    int hp() 
    { 
     return (health); 
    } 

    int dmg() 
    { 
     return (damage); 
    } 

}; 

pokemon::pokemon (int hp, int dmg) 
{ 
    health = hp; 
    damage = dmg; 


    pokemon charmander (25,3); 
    pokemon bulbasaur (20,4); 
    pokemon squirtle (30,2); 
    cout<<" Charmander has "<<charmander.hp()<<" hp and "<<charmander.dmg()<<" damage.\n"; 
    cout<<" Bulbasaur has "<<bulbasaur.hp()<<" hp and "<<bulbasaur.dmg()<<" damage.\n"; 
    cout<<" Squirtle has "<<squirtle.hp()<<" hp and "<<squirtle.dmg()<<" damage.\n"; 

} 

//pokemain.cpp 
#include <iostream> 
#include "stats.h" 
using namespace std; 


int main() 
{ 
    cout<<charmander.hp(); 
    return 0; 
} 

ответ

3

Переменные charmander, bulbausar и squirtle объявляются внутри конструктора. Поместите их в свою основную часть, и она должна работать.

int main(void) { 
    pokemon charmander(25,3); 
    pokemon bulbausar(25,3); 
    pokemon squirtle(25,3); 

    cout<<" Charmander has "<<charmander.hp()<<" hp and "<<charmander.dmg()<<" damage.\n"; 
    cout<<" Bulbasaur has "<<bulbasaur.hp()<<" hp and "<<bulbasaur.dmg()<<" damage.\n"; 
    cout<<" Squirtle has "<<squirtle.hp()<<" hp and "<<squirtle.dmg()<<" damage.\n"; 

    return 0; 
} 
+0

Спасибо за ваш ответ. Вы оба спасли мне много исследований – Chuy

+0

Нет проблем. Я советую вам изучить, что такое конструкторы. Я могу сказать, что вы полностью не понимаете концепцию. Вы можете начать здесь: http://www.fredosaurus.com/notes-cpp/oop-condestructors/constructors.html – Tiago

+0

спасибо за эту ссылку, сейчас я нахожусь на C++ в колледже, и мне очень трудно понять моего учителя из-за ее акцент. – Chuy

1

charmander объявлен в конструкторе pokemon класса, что означает, что это единственное место, где это видно. Вероятно, вы захотите переместить эти объявления и код, который их использует, до main.

Объявление экземпляра класса в конструкторе для этого же класса вызовет бесконечный цикл, в любом случае - подумайте об этом.

+0

благодарит за ответ и ответ! Это сработало. – Chuy

0

Вы никогда не создавали экземпляр класса. При создании класса очень возможно иметь экземпляры того же класса, что и рекурсивный экземпляр. При этом программа не знает, откуда вы пришли в своей декларации. Чтобы исправить ошибку, удалите объявление pokemon в основную часть программы.

int main() 
{ 
    pokemon c; 

    cout << "C has " << c.hp() << endl; 
    return 0; 
} 

, скорее всего, работать.

+0

спасибо за пример! – Chuy