#include \"stdafx.h\"
#include <iostream>
class CPlayer
{
private:
int m_iHP;
public:
CPlayer(void) : m_iHP(0){}
CPlayer(CPlayer* _pPlayer)
{
this->m_iHP = _pPlayer->GetHP();
}
~CPlayer() {}
virtual void SetHP( int iHP ) { m_iHP = iHP; };
virtual int GetHP(void){ return m_iHP; }
virtual void FrameMove()
{
std::cout<<m_iHP<<std::endl; // 현재 HP 출력
}
};
class CPlayer_Potion : CPlayer
{
CPlayer m_Player;
public:
CPlayer_Potion(CPlayer _player)
{
m_Player = _player;
}
virtual void FrameMove()
{
static int iCount = 0;
++iCount;
m_Player.SetHP( m_Player.GetHP() + 1 ); // 상속받아서 HP 1 증가해서
m_Player.FrameMove(); // HP 출력
}
};
int _tmain(int argc, _TCHAR* argv[])
{
CPlayer* player = new CPlayer();
for( int i = 0 ; i < 2000000 ; ++i )
{
if( (i%2) == 1 )
{
CPlayer* playerTmp = player;
player = (CPlayer *)new CPlayer_Potion( *player );
delete playerTmp;
}
if( (i%2) == 0 )
{
CPlayer* playerTmp = player;
player = new CPlayer( player );
delete playerTmp;
}
player->FrameMove();
}
delete player;
return 0;
}
죄송하지만 질문 좀 할게요
상단의 CPlayer class 복사생성자에서 하고 싶은 일은
main함수에서
player = (CPlayer *)new CPlayer_Potion( *player );
player->FrameMove();
를 실행시키고 HP를 증가시킨 값이거든요.
근데 객체 내부를 까보니까
CPlayer의 m_iHP는 0이 들어가있고
CPlayer에 잡아넣은 CPlayer_Potion 안에 있는 CPlayer객체의 m_iHP의 값이
제가 원하는 1증가된 값으로 설정되어 있더군요.
저는 저 프로그램이 한 번씩 쉬어가면서 1씩 증가시키는 일을 하도록 했으면 좋겠는데
그렇게 하도록 바꾸려면 어떤 부분을 어떻게 해야 할까요?...
아니면
CPlayer에 잡아넣은 CPlayer_Potion 안에 있는 CPlayer객체의 m_iHP에 접근하려면 어떻게 해야 할까요?
복사생성자는 무조건 레퍼런스로 받으란 얘기 못들었니?
조언 감사해요 ^^ 하지만 제가 원하는 결과를 얻으려면 어떻게 해야 할까요?
들여쓰기 제대로 해서 다시 올려봐 봐줄께
햏햏했// 님 말씀대로 레퍼런스를 넘기게 되면 main에서 잡아넣은 CPlayer_Potion에 관련된 정보는 넘겨받지 못하게 되요 ^^;
C++좆도몰라서 하는소린데 : 이게 뭔뜻이냐
뭘 하겠다는건 아니고 그냥 연습하던 중에 짜본 코드예요 ^^ 한 타이밍씩 쉬어가면서 숫자를 증가시키는 프로그램이지요
물론 지금 상태로는 정상 작동을 하지 않고 01010101만 찍어대겠지요 ^^;
Heidelloon//나두 C++은 좆도 모르지만...딱 보면 상속받는거네 ㅡㅡ;; java로 치면 extends ...
m_iHP를 static 선언해야지
새로 cPlayer가 생성이 되면 0으로 초기화 되는건 당연한거자녀
지금 한객체로 계속 삽질푸는게 아니고 계속 객체생성 하는거자네
레퍼런스를 쓰든지 포인터를 쓰든지
그리고 플레이어의 포션이 플레이어를 상속받는건 무슨 개념인거야 대체... Player_Potion is-a Player?
상속받을 이유가 없어 보이는데, 그럼 상속을 받지 말아야지. CPlayer_Potion이 CPlayer의 포인터나 레퍼런스를 갖고 있고, 그 인스턴스의 값을 수정하도록 해야지. 지금은 포션마다 새 인스턴스를 만들잖아.
그건 연습하다보니까 내용을 막 뜯어고쳐서 이름이 좀 이상해진거 같네요 ^^;;
지금 대충 하는거 보니까 상속받은 객체를 여러개 생성해서 한 객체의 값을 변경하면 모두 같이 변하게 하려나본데 다형성으로는 적용 안됨 ㄳ
글고 그냥 연습중에 만들어본 코드니까 왜 저런식으로 하냐고 물어보시면 ^^;;
저거를 저렇게 만들지 말고 그냥 CPlayer_Potion 형 객체로만 계속 인스턴스를 생성하면 원하는데로 될꺼야
for loop 안에서 한 번은 CPlayer의 framemove()를 쓰고 한 번은 potion의 framemove()를 쓰려고 한거예요
그럴려면 static으로 선언해야대
아 ^^... 귀찮게 막 질문해서 죄송했습니다 도와주셔서 감사해요