내가 클래스추상 클래스 참조
클래스 룸에게 {가질 수 ~ 방(); 가상 비용() = 0; }
클래스 호텔 {지도 객실;/* * /};
내 호텔이 추상화됩니까? Room에서 파생 된 구체적인 Room 객체 목록을 보유 할 수 있습니까?
내가 클래스추상 클래스 참조
클래스 룸에게 {가질 수 ~ 방(); 가상 비용() = 0; }
클래스 호텔 {지도 객실;/* * /};
내 호텔이 추상화됩니까? Room에서 파생 된 구체적인 Room 객체 목록을 보유 할 수 있습니까?
작성한 코드가 C++로 유효하지 않습니다. 의미하는 경우 :
class Room{
~Room();
virtual int cost() =0;
};
그렇다면 클래스는 추상입니다. 당신은 다음과 같은지도를 만들 수 없습니다 :
map <int, Room> rooms;
을하지만,이 같은 수 있습니다 : 당신이 방에서 파생 된 비용()를 구현하는 클래스 SingleRoom이 가정 다음
map <int, Room *> rooms;
을, 당신은 말할 수 :
rooms.insert(make_pair(101, new SingleRoom));
또한 추상 클래스에는 가상 소멸자가 있어야합니다.
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
()을 상속하고 구현 한 추상 클래스입니다. 이것은 당신이 그것에 대해 할 수있는 한 가지 방법입니다.
질문을 확장하거나 다시 말하면 무엇을 묻고 있는지 잘 이해할 수 있으면 답을 업데이트 할 것입니다.
아마도 호텔은 다양한 종류의 객실을 저장할 수 있습니다. 는이 경우 호텔의지도는 다음과 같이, 객실보다는 실 자체에 대한 포인터를 저장하는 데 필요 :이 예에서
class Hotel
{
std::map<int,Room *> roomMap; // maps room numbers to rooms
};
내가 방을 가리키는 포인터에 방 번호를 매핑지도를 사용했다. 방 포인터 대신 방을 저장하면 방을 단독으로 인스턴스화 할 수 없으므로 단순히 컴파일하지 않습니다.
룸 포인터를 저장하는 경우 이후에 방을 삭제하는 사람도 있어야합니다. 룸에 가상 소멸자를 지정하고 (Neil이 이미 지적한 것처럼) 호텔의 소멸자에서 방을 삭제합니다.
'int cost() = 0; 앞에'virtual'이 누락되어 있지 않습니까? Neil? – fredoverflow
@Fred 예 - 감사합니다. –