2010-06-07 6 views
1

Puis-je avoir une classeréférence abstraite de classe

Chambre classe {~ Chambre(); coût virtuel() = 0; }

Class Hôtel {carte chambres;/* * /};

Mon hôtel deviendra-t-il abstrait? Peut-elle contenir la liste des objets de pièce concrets dérivés de Room?

Répondre

5

Le code que vous avez écrit n'est pas valide C++. Si vous voulez dire:

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

alors oui, la classe est abstraite. Vous ne pouvez alors créer une carte comme celle-ci:

map <int, Room> rooms; 

mais vous pouvez comme ceci:

map <int, Room *> rooms; 

Ensuite, en supposant que vous avez une singleroom de classe qui est dérivée de la chambre et met en œuvre le coût(), vous pouvez dire :

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

Notez également que les classes abstraites doivent avoir des destructeurs virtuels.

+0

Vous ne manquez pas un 'virtual' devant' int cost() = 0; 'Neil? – fredoverflow

+0

@Fred Oui - merci. –

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 
    } 
} 

Et voilà. Exemple de base, ici HotelRoom est une classe abstraite avec Room et NicerRoom héritant et implémentant la méthode virtuelle pure cost(). C'est une façon de le faire.

Si vous développez ou reformulez votre question afin que je puisse mieux comprendre ce que vous demandez, je mettrai à jour ma réponse.

+0

Vous voulez probablement dire: class HotelRoom au lieu de class Hotel. Je ne pense pas qu'une chambre est un genre d'hôtel. – Patrick

+0

Vous avez raison, cela le rend plus cohérent. J'allais juste avec les noms donnés dans la question. – Konrad

0

Ce que vous voulez probablement, c'est que l'hôtel peut stocker différents types de chambres. Dans ce cas, la carte de l'hôtel a besoin de stocker des pointeurs dans les chambres plutôt que les chambres lui-même, comme celui-ci:

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

Dans cet exemple, j'utilisé une carte pour cartographier les numéros de chambre des pointeurs pointant vers la pièce. Si nous avions stocké des pièces au lieu des pointeurs de pièce, cela ne compilerait pas simplement puisque nous ne pouvons pas instancier une pièce par lui-même. Notez que si vous stockez des pointeurs de pièce, il doit également y avoir quelqu'un qui supprime les pièces par la suite. Donnez à Room un destructeur virtuel (comme Neil l'a déjà souligné) et effacez simplement les chambres du destructeur de Hotel.

Questions connexes