2014-06-09 2 views
0

이것은 내가 읽은 다른 질문과 비슷합니다. 나는 이동 수업을 쓰려고 노력하고있다. Player 클래스와 Move 클래스를 상속하는 Item 클래스가 필요합니다. 그것이 내가 어려움을 겪고있는 것입니다. 나는 내 머리를 감싸거나 일하러 갈 수 없다. 기본 클래스가 "움직이지 마라"는 방식이다. 나는 여기에서 길을 잃었다. ...C++ 클래스 상속 명령

class Player { 

protected: 
    int x; 
    int y; 
    int str; 
    int speed; 
    int level; 
    int exp; 

public: 
    Player(int _str, int _speed, int _level, int _exp) { x=0;y=0;str=_str;speed=_speed;level=_level;exp=_exp; } 
    int GetX() {return x;} 
    int GetY() {return y;} 
    int GetStr() {return str;} 
    int GetSpeed() {return speed;} 
    int GetLevel() {return level;} 
    int GetExp() {return exp;} 

}; 


class Move : public Player { 
public: 
    void TryMove(int n) { x += n; } 
}; 


int main(int argc, char *argv[]) 
{ 
Player You(101, 5, 3, 43625); 


//You.TryMove(5); how? 


} 

TryMove (5)는 실패한다. 만약 내가 다른 방법을한다면, 그때 그들은 타입 (Move?)이고, 전혀 소리가 나지 않습니다 ...

+0

처음에는 http://programmers.stackexchange.com/에 더 적합합니다. 둘째, 질문에 대답하기 전에이 수업의 목적을 아는 것이 도움이 될 것입니다. –

답변

2

Is A 또는 Has A 관용구이다의 내가 생각을 추천 할 것입니다 방법을. 그래서 ... 플레이어가 움직입니까? 아마, Move A Player인가? 아마 또한. 그런 다음 Has A을 사용해보십시오. 이동에는 플레이어가 있습니까? 또는 플레이어가 이동합니까? 나는 선수가 개인적으로 움직인다 고 말하고 싶다. 이것은 상속을 사용하지 않고 플레이어에 Move 클래스의 인스턴스를 포함시키는 것을 의미합니다. 그래서 ...

class Player{ 
public: 
    Move myMove;//where move is defined already as whatever you need it to be.  
}; 

//then your main 
int main(int argc, const char** argv){ 
    //...other setup here 
    Player p; 
    p.myMove.TryMove(10); 
    //whatever else... 
} 

이것은 내가 당신의 디자인에 접근 할 수있는 방법입니다. 오류까지 ... 위 코드에서 MovePlayer에서 상속 받았지만 Player을 생성했으며 Move의 기능을 가질 것으로 예상했지만 설정 한 상속을 기반으로 해당 기능을 사용할 방법이 없습니다. 예제 코드.

내가 무엇을 말했는지 또는 다른 것의 설명이 필요한지 알려주십시오. 행운을 빕니다

편집 : 나는 당신이 필요로하는 가치를 얻을 것이다 래퍼 함수를 ​​사용하는 것이 좋습니다 것입니다 귀하의 의견을 바탕으로

.

class Player{ 
public: 
    void TryMove(int i); 
private: 
    Move myMove; 
    int x;//the value you will be getting from Move::tryMove 
}; 

void Player::TryMove(int i){ 
    this->x = myMove.tryMove(i);//store the value of the function call 
    //the function obviously won't be a void function in this case 
} 

이렇게 할 수있는 다른 방법이 있지만이 방법은 간단합니다. 문제를 해결하기 위해 상속을 사용하도록 설정했다면 PlayerMove에서 상속 받겠습니다.하지만 저는 여전히 원래의 대답으로 설득하고 있습니다.

+0

감사합니다. 내가 목표로 삼고있는 디자인은 Move 클래스가 부모 클래스의 값을 변경할 수 있도록하는 것입니다. 그래서 저는 플레이어가 있습니다. tryMove()를 호출합니다. 플레이어 x 값을 변경해야합니다. –

+0

@EvanCarslake 나는 이것을 시도하고 수정하기 위해 편집을 쓸 것이다. 아마도 래퍼 함수를 ​​제안 할 것입니다. –

+0

니스, 그게 내가 찾고 있었던 바로 그거야. 그래도 또 다른 질문. Move 클래스 내에서 공용/보호 된 변수에 액세스 할 수있는 방법이 있습니까? tryMove와 같이 플레이어 나 항목 x, y, 너비 및 높이 변수를 알아야합니다. 저는 그것들을 매개 변수로 보낼 수 있다고 생각하지만 다른 방법이 있습니까? –

2

우선 public 상속IS-A을 의미합니다. 따라서 Move IS-A Player은 이해가되지 않습니다. 디자인이 잘못되었습니다.

오류에 대해 이것은 단지 바보입니다. Player 오브젝트 You을 작성 중이고 호출 방법이 Move입니다. Move 클래스의 메서드를 사용하려면 Move (또는 공개적으로 파생 클래스)의 개체를 만들어야합니다.

class Move : public Player { 
    public: 
    //either create a ctor that will pass params to parent ctor, or create an empty ctro in parent class 
    Move(int _str, int _speed, int _level, int _exp):Player(_str,_speed,_level,_exp){} 
    void TryMove(int n) { x += n; } 
}; 


int main(int argc, char *argv[]){ 

    Move You(101, 5, 3, 43625); 
    You.TryMove(5); 
} 

나는 다음과 같이 설계 것 :

class Movable{ 
    public: 
    virtual bool TryMove()=0; 
}; 

class Player: public Movable { 
public: 
    bool TryMove() override{ 
    //implementation code 
    } 

//other members 
}; 

int main(){ 
    Movable* player = new Player(101, 5, 3, 43625); 
    player->TryMove(); 
    delete player; 
} 
+0

감사. "플레이어"가 플레이어에 대한 모든 것을 정의하도록하는 중 "아이템"클래스는 기본적으로 동일합니다. 플레이어와 아이템 클래스 모두 보호 된 변수 x, y, width 및 height를가집니다. move 클래스에는 x 및 y 값을 변경하는 모든 멤버 함수가 있습니다. "Player"를 정상적으로 선언하고 "Item"과 동일하며 "Move"에서 함수를 사용하여 이동할 수있게 할 계획입니다. –

+0

@EvanCarslake'Move'에서'Player'를 파생 시켰습니까? – Appleshell

+0

@Appleshell, 그게 내가 생각했던 것이지만, 이동 클래스를 통해 모든 플레이어 속성을 호출하는 것이 이상하게 보였다. –