2012-03-15 12 views
9

Possible Duplicate:
C++ STL set update is tedious: I can't change an element in placestd :: set iterator automaticamente const

ho estratto il problema e ha cambiato nomi e così per amor di semplicità.

Fondamentalmente ho un'istanza di una classe e di I stock in uno std :: set, in seguito mi piacerebbe avere un riferimento alla classe in modo che posso controllare i suoi valori e modificarli ...

il codice semplificato:

 MyClass tmpClass; 
     std::set<MyClass > setMyClass; 
     setMyClass.insert(tmpClass); 
     std::set<MyClass >::iterator iter; 
     iter=setMyClass.begin(); 
     MyClass &tmpClass2=*iter; 

e l'errore:

error C2440: 'initializing' : cannot convert from 'const MyClass' to 'MyClass &' 

(ho rimosso le parti del messaggio di errore "MVB :: :: Run" per cancellare in su troppo.)

se aggiungere un 'const' che precede l'ultima riga di codice, allora tutto funziona bene, ma poi non posso cambiare il valore ...

È questo un comportamento normale e devo, per esempio, rimuovere il dati, cambiare valori e rimetterlo?

Ho la sensazione che questo abbia qualcosa a che fare con l'ordinamento del set ma non toccherò le variabili utilizzate per l'ordinamento.

risposta

12

mi si è certi che si won't touch the variables that are used for the sorting la si potrebbe ovviare a questo utilizzando un const_cast come questo:

MyClass tmpClass; 
    std::set<MyClass > setMyClass; 
    setMyClass.insert(tmpClass); 
    std::set<MyClass >::iterator iter; 
    iter=setMyClass.begin(); 
    const MyClass &tmpClass2=*iter; 

    MyClass &tmpClass3 = const_cast<MyClass&>(tmpClass2); 

alternativa, è possibile dichiarare i membri della classe che si intende cambiare mutable.

+2

Puoi farlo, ma è una cattiva pratica. –

12

Sì, questo è previsto. Se sei stato in grado di modificare gli oggetti già nel set, l'ordinamento applicato potrebbe non essere più applicabile, portando a un comportamento non definito.

Problemi correlati