2010-06-07 7 views
1

내가 클래스추상 클래스 참조

클래스 룸에게 {가질 수 ~ 방(); 가상 비용() = 0; }

클래스 호텔 {지도 객실;/* * /};

내 호텔이 추상화됩니까? Room에서 파생 된 구체적인 Room 객체 목록을 보유 할 수 있습니까?

답변

5

작성한 코드가 C++로 유효하지 않습니다. 의미하는 경우 :

class Room{ 
    ~Room(); 
    virtual int cost() =0; 
}; 

그렇다면 클래스는 추상입니다. 당신은 다음과 같은지도를 만들 수 없습니다 :

map <int, Room> rooms; 

을하지만,이 같은 수 있습니다 : 당신이 방에서 파생 된 비용()를 구현하는 클래스 SingleRoom이 가정 다음

map <int, Room *> rooms; 

을, 당신은 말할 수 :

rooms.insert(make_pair(101, new SingleRoom)); 

또한 추상 클래스에는 가상 소멸자가 있어야합니다.

+0

'int cost() = 0; 앞에'virtual'이 누락되어 있지 않습니까? Neil? – fredoverflow

+0

@Fred 예 - 감사합니다. –

0
class Hotel 
{ 
public: 
    void AddRoom() 
    { 
     m_Rooms.insert(std::make_pair(10, new Room)); // Remember to delete 
    } 

    void AddNicerRoom() 
    { 
     m_Rooms.insert(std::make_pair(10, new NicerRoom)); // Remember to delete 
    } 
private: 
    std::map< unsigned int, HotelRoom* > m_Rooms; 
} 

class HotelRoom 
{ 
public: 
    ~HotelRoom; // Virtual Dtor 

protected: 
    virtual int cost() = 0; 
} 

class Room : public HotelRoom 
{ 
    /*virtual*/ int cost() 
    { 
     // impl 
    } 
} 

class NicerRoom : public HotelRoom 
{ 
    /*virtual*/ int cost() 
    { 
     // impl 
    } 
} 

여기 있습니다. 기본 예제, 여기 HotelRoom은 Room과 NicerRoom이 추상 가상 메소드 cost()을 상속하고 구현 한 추상 클래스입니다. 이것은 당신이 그것에 대해 할 수있는 한 가지 방법입니다.

질문을 확장하거나 다시 말하면 무엇을 묻고 있는지 잘 이해할 수 있으면 답을 업데이트 할 것입니다.

+0

아마도 당신은 class Hotel 대신 class HotelRoom을 의미 할 것입니다. 나는 방이 일종의 호텔이라고 생각하지 않는다. – Patrick

+0

당신이 옳다면 그것이 더 일관성있게됩니다. 나는 그 질문에서 주어진 이름들과 함께 가고 있었다. – Konrad

0

아마도 호텔은 다양한 종류의 객실을 저장할 수 있습니다. 는이 경우 호텔의지도는 다음과 같이, 객실보다는 실 자체에 대한 포인터를 저장하는 데 필요 :이 예에서

class Hotel 
    { 
    std::map<int,Room *> roomMap; // maps room numbers to rooms 
    }; 

내가 방을 가리키는 포인터에 방 번호를 매핑지도를 사용했다. 방 포인터 대신 방을 저장하면 방을 단독으로 인스턴스화 할 수 없으므로 단순히 컴파일하지 않습니다.

룸 포인터를 저장하는 경우 이후에 방을 삭제하는 사람도 있어야합니다. 룸에 가상 소멸자를 지정하고 (Neil이 이미 지적한 것처럼) 호텔의 소멸자에서 방을 삭제합니다.