2014-11-24 4 views
2

나는 클래스 Player을 가지고 있고 Gun에서 파생 된 클래스의 수에 관계없이 설정할 수있는 primaryWeapon 멤버가 필요합니다. 이 작업을 수행하는 방법에 대해 궁금합니다. 나는 이걸 시험해 보려고했지만 여기서 어디로 가야할지 모르겠다.C++ - 속성으로 기본 클래스

class Player : public Character { 
    public: 
     Player(); 
     ~Player(); 

     Gun primaryWeapon; 

     void update(); 
     void move(float horizontal, float vertical); 
     void fire(); 
}; 
+1

다형성을위한 포인터 또는 참조가 필요합니다. 'Gun * primaryWeapon;'(또는, 더 좋은 것은'std :: shared_ptr '또는'std :: unique_ptr '와 같은 스마트 포인터를 사용하는 것입니다.) – cdhowie

+0

시도해 보았습니다. 그러나 primaryWeapon = new DevPistol()을 수행하면 "No viable overloaded '='"오류가 발생합니다. –

+3

이 오류가 발생하면'primaryWeapon' 유형은 무엇입니까? 예를 들어'std :: unique_ptr'이라면'primaryWeapon.reset (new DevPistol())'을 할 필요가 있습니다. – sfjac

답변

2

하는 C의 다형성 (polymorphic)를 사용하는 경우 :

boost::shared_pt<Gun> shrdPrimaryWeapon; 

는 그러면 (getWeaponAmmoForExample 등) 건의 다형성 함수를 정의와 함께 사용 바늘. 예를 들어 Gun 개체를 값으로 저장하면 개체가 파생 된 형식에서 기본 형식으로 "조각"됩니다.

참조를 사용하는지 여부, 원시 포인터 shared_ptr 또는 unique_ptr은 프로그램의 전체 디자인에 따라 다르지만 그 중 하나가 트릭을 수행합니다.

0

primaryWeapon에는 Gun에 대한 포인터를 사용할 수 있습니다. 만약 기준 또는 어느 통한 다형성 오브젝트를 참조 할 필요 ++

shrdPrimaryWeapon->getWeaponAmmoForExample(); 
1

다형성 동작을 원할 경우 primaryWeapon이 포인터, 포인터 또는 스마트 포인터 여야합니다. 레퍼런스는 플레이어가 자신의 primaryWeapon을 바꾸는 것을 방해합니다. 그렇게 (똑똑한) 포인터를 남깁니다. 플레이어가 총을 소유하고 있다면 unique_ptr :

#include <memory> 

class Gun { 
public: 
    virtual ~Gun(){} 
}; 

class Glock : public Gun {}; 

class Player { 
public: 
    void setPrimaryWeapon(std::unique_ptr<Gun> weapon) { 
    primaryWeapon = std::move(weapon); 
    } 
private: 
    std::unique_ptr<Gun> primaryWeapon;  
}; 

int main() { 
    Player player; 
    player.setPrimaryWeapon(std::make_unique<Glock>()); 
}