クラスを受講できますか
教室{ ~Room(); 仮想コスト() =0; }
クラス ホテル{ 部屋をマップする; /* */};
私のホテルは抽象的になりますか?Room から派生した具体的な Room オブジェクトのリストを保持できますか?
クラスを受講できますか
教室{ ~Room(); 仮想コスト() =0; }
クラス ホテル{ 部屋をマップする; /* */};
私のホテルは抽象的になりますか?Room から派生した具体的な Room オブジェクトのリストを保持できますか?
あなたが書いたコードは有効な C++ ではありません。つまり:
class Room{
~Room();
virtual int cost() =0;
};
はい、クラスは抽象です。次のようなマップを作成することはできません。
map <int, Room> rooms;
しかし、あなたはこれを好きにすることができます:
map <int, Room *> rooms;
次に、Room から派生し、cost() を実装するクラス SingleRoom があると仮定すると、次のように言えます。
rooms.insert( make_pair( 101, new SingleRoom ) );
また、抽象クラスには仮想デストラクタが必要であることに注意してください。
おそらくあなたが望むのは、ホテルがさまざまな種類の部屋を保管できることです。その場合、ホテルのマップは、次のように、部屋自体ではなく部屋へのポインターを保存する必要があります。
class Hotel
{
std::map<int,Room *> roomMap; // maps room numbers to rooms
};
この例では、マップを使用して部屋番号を部屋を指すポインタにマップしました。Room ポインタの代わりに Room を格納した場合、これは単純にコンパイルされません。なぜなら、それ自体では Room をインスタンス化できないからです。
Room-pointers を保存すると、後で Room を削除する人もいることに注意してください。ルームに仮想デストラクタを与え(ニールがすでに指摘したように)、ホテルのデストラクタで部屋を削除するだけです。
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
}
}
ほらね。cost
基本的な例です。ここでの HotelRoom は、純粋な仮想メソッド()を継承して実装する Room と NicerRoom を持つ抽象クラスです。これは、あなたがそれを行うための 1 つの方法です。
質問を拡張または言い換えて、あなたが求めていることをよりよく理解できるようにしたら、回答を更新します。