2010-02-27 15 views
7

Ci-dessous est la classe utilisée comme la valeur d'une carte:Pourquoi une classe utilisée comme valeur dans une carte STL a-t-elle besoin d'un constructeur par défaut dans ...?

map< int, Book > mapBooks; 

for(int i = 0; i &lt 10; ++i) 
{ 
    Book b(i); 
    mapBooks[ i ] = b; 
} 

La déclaration provoque l'erreur est::

mapBooks[ i ] = b; 

Si j'ajoute

class Book 
{ 
    int m_nId; 
public: 
    // Book() { } <----- Why is this required? 
    Book(int id): m_nId(id) { } 

}; 

principal() A l'intérieur un constructeur par défaut, l'erreur n'apparaît pas. Cependant, je ne comprends pas pourquoi le besoin. Quelqu'un peut-il expliquer? Si j'utilise insert(), le problème n'apparaît pas. Par ailleurs, j'utilise Visual C++ 2008 pour compiler.

Répondre

11

operator[] effectue un processus en deux étapes. D'abord, il trouve ou crée une entrée de carte pour la clé donnée, puis il renvoie une référence à la partie valeur de l'entrée afin que le code appelant puisse lire ou écrire dessus.

Dans le cas où l'entrée n'existait pas auparavant, la valeur moitié de l'entrée doit être construite par défaut avant d'être affectée à. C'est juste la façon dont l'interface doit fonctionner pour être cohérente avec le cas où l'entrée existait déjà.

Si besoin d'utiliser un tel type dans une carte, alors vous devez éviter l'utilisation de operator[] en utilisant find et insert "manuellement".

+1

Pour être précis, 'operator []' n'attribue pas, mais renvoie une référence à la valeur nouvellement créée. L'affectation est un code utilisateur. –

+0

@dribeas: Oui, c'est vrai. Je vais mettre à jour pour les pédants! –