2014-11-07 1 views
0

저는 C++을 처음 접했고 상속을 연습하고 있으며 아래 코드를 입력했습니다. Squirtle.cpp에서 visual studio는 newHp, newLevel, newExperience 및 newAttack이 모두 정의되지 않았다고 말합니다. 왜 이런 경우입니까? 어떻게 수정해야합니까? 나는 다른 예제를 여기에서 찾았다. this하지만 기본 생성자와 자식 생성자가 모두 같은 파일에 있기 때문에 오류가 발생하지 않을까?내 IDE에서 Squirtle.cpp 생성자에서 "newHp"가 정의되지 않았다고 말하는 이유는 무엇입니까?

**** Pokemon.h ****

#ifndef _POKEMON_ 
#define _POKEMON_ 
#include <string> 
#include <iostream> 
using namespace std; 

class Pokemon { 
//Members 
private: 
    int hp; 
    int level; 
    int experience; 
    int attack; 
//Member functions 
public: 
    Pokemon(int newHp, int newLevel, int newExperience, int newAttack); 
    virtual ~Pokemon(); 
    int getHp(); 
    int getAttack(); 
    void setHp(int newHp); 
    void setAttack(int newAttack); 
    void physicalAttack(Pokemon &target); 
}; 

#endif 

**** Pokemon.cpp ****

#include "Pokemon.h" 


Pokemon::Pokemon(int newHp, int newLevel, int newExperience, int newAttack) 
{ 
    hp = newHp; 
    level = newLevel; 
    experience = newExperience; 
    attack = newAttack; 

} 

Pokemon::~Pokemon() 
{ 
} 

int Pokemon::getHp() 
{ 
    return hp; 
} 

int Pokemon::getAttack() 
{ 
    return attack; 
} 

void Pokemon::setHp(int newHp) 
{ 
    hp = newHp; 
} 

void Pokemon::setAttack(int newAttack) 
{ 
    attack = newAttack; 
} 

void Pokemon::physicalAttack(Pokemon &target) 
{ 
    target.setHp(target.getHp() - getAttack()); 
    cout << "Dealt " << getAttack() << "damages to target! Hp is now at " << target.getHp() << "!"; 
} 

**** Squirtle.h *** *

#include "Pokemon.h" 
#ifndef _SQUIRTLE_ 
#define _SQUIRTLE_ 
class Squirtle :Pokemon{ 
//members 
private: 
    int mana; 
//member functions 
public: 
    Squirtle(int newMana); 
    int getMana(); 
    void setMana(int newMana); 
    void freeze(Pokemon &target); 
}; 

#endif 

**** Squirtle.cpp ****

#include "Squirtle.h" 

Squirtle::Squirtle(int newMana):Pokemon(newHp, newLevel, newExperience, newAttack) 
{ 
    mana = newMana; 
} 

int Squirtle::getMana() 
{ 
    return mana; 
} 

void Squirtle::setMana(int newMana) 
{ 
    mana = newMana; 
} 

void Squirtle::freeze(Pokemon &target) 
{ 
    setMana(getMana() - 1); 
    target.setAttack(0); 
    cout << "Squirtle has frozen the target! Its attack is now reduced to 0!"; 
} 
이 생성자 정의

Squirtle::Squirtle(int newMana):Pokemon(newHp, newLevel, newExperience, newAttack) 
{ 
    mana = newMana; 
} 

식별자 newHp, newLevel, newExperience, newAttack

+0

정말 많은 코드를 게시해야하며 부팅 할 공간이 너무 많습니까? 또한 참고로, 4 개의 별표는 여기에 점수를 매기는 것을 의미하지 않습니다. – Deduplicator

+0

당신의 포함 가드는 [예약 된 식별자] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier)입니다. – chris

답변

0

에서 선언되지 않는다. 그래서 컴파일러는 예를 들어 알지 못합니다. newHp

+0

Writing "... : Pokemon (int newHp, int newLevel, ...") 또한 오류가 발생합니다. 기본 생성자가 다른 경우에 참조 할 때마다 기본 생성자의 변수를 정의해야합니다. file? – user2997154

+2

@ user2997154 당신은 함수를 선언하지 않고 함수를 호출하는 것처럼 그 부분을 다루어야합니다. 그게 바로 그것이하는 일입니다 : 포켓몬의 생성자를 호출합니다. 당신은 4 개의 값을 취하기 위해 생성자를 작성했습니다. 그 라인에서 하드 코딩 될 것인가? 그들이 전달 된 Squirtle 생성자의 매개 변수가되어야 하는가? 지금은 변수가 선언되지 않았기 때문에 아무 데서도 오지 않는다. 그래서 컴파일러는 – TheUndeadFish

+0

정말 고마워! 그 점이 나를 이해하는 데 정말로 도움이되었다. – user2997154

관련 문제