2010-02-27 12 views
7

Poniżej jest klasa używana jako wartość w mapie:Dlaczego klasa używana jako wartość w mapie STL potrzebuje domyślnego konstruktora w ...?

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

}; 

Wewnątrz main():

map< int, Book > mapBooks; 

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

Oświadczenie przyczyną błędu jest:

mapBooks[ i ] = b; 

Jeśli dodać domyślny konstruktor, błąd nie pojawia się. Jednak nie rozumiem, dlaczego potrzeba. Czy ktoś może wyjaśnić? Jeśli użyję insert(), problem nie pojawi się.

Nawiasem mówiąc, używam Visual C++ 2008 do kompilacji.

Odpowiedz

11

operator[] wykonuje dwuetapowy proces. Najpierw znajduje lub tworzy wpis mapy dla danego klucza, następnie zwraca odniesienie do części wartości wpisu, aby kod wywołujący mógł go odczytać lub zapisać.

W przypadku, gdy wpis nie istniał wcześniej, wartość połowy wpisu musi być domyślnie skonstruowana przed przypisaniem do. Jest to po prostu sposób, w jaki interfejs musi działać, aby był spójny z przypadkiem, w którym wpis już istniał.

Jeśli trzeba użyć takiego typu na mapie, należy unikać używania "operator[]", używając "find i insert" ręcznie ".

+1

Mówiąc dokładniej, 'operator []' nie przypisuje, ale zwraca odniesienie do nowo utworzonej wartości. Przypisanie to kod użytkownika. –

+0

@dribeas: Tak, prawda. Zaktualizuję dla pedantów! –

Powiązane problemy