1

我可以上课吗

教室{~Room(); 虚拟成本()=0;}

一流酒店{ 地图房间;/* */ };

我的酒店会变得抽象吗?它可以保存从 Room 派生的具体 Room 对象的列表吗?

4

3 回答 3

5

您编写的代码不是有效的 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 ) );

另外,请注意抽象类必须有虚拟析构函数。

于 2010-06-07T09:32:49.770 回答
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()。这是你可以去做的一种方式。

如果您扩展或改写您的问题,以便我更好地理解您的要求,我会更新我的答案。

于 2010-06-07T09:33:39.207 回答
0

您可能想要的是酒店可以存储不同类型的房间。在这种情况下,酒店中的地图需要存储指向房间的指针而不是房间本身,如下所示:

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

在此示例中,我使用地图将房间号映射到指向房间的指针。如果我们存储的是房间而不是房间指针,那么这将不会简单地编译,因为我们不能自己实例化房间。

请注意,如果您存储房间指针,那么之后也应该有人删除房间。给 Room 一个虚拟析构函数(就像 Neil 已经指出的那样),然后删除 Hotel 析构函数中的房间。

于 2010-06-07T09:39:07.003 回答