2012-03-15 33 views
9

Possible Duplicate:
C++ STL set update is tedious: I can't change an element in placestd :: set iterador automáticamente const

he extraído el problema y cambiado de nombre y así por el bien de simplicidad.

Básicamente crear instancias de una clase y acciones de la misma en un std :: set, después me gustaría tener una referencia a la clase de modo que pueda comprobar sus valores y modificarlos ...

el código simplificado:

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

y el error:

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

(que eliminan partes del mensaje de error, "MVB :: :: Run" para borrar para arriba también.)

si añadir un 'const' que precede a la última línea de código a continuación, todo funciona bien pero entonces no puedo cambiar el valor ...

Es este comportamiento normal y tengo que, por ejemplo, eliminar el datos, cambiar valores y volver a ponerlo?

Tengo la sensación de que esto tiene algo que ver con la clasificación del conjunto, pero no voy a tocar las variables que se utilizan para la clasificación.

Respuesta

12

que está seguro de que won't touch the variables that are used for the sorting la que podría evitar esto usando un const_cast así:

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); 

Como alternativa, puede declarar los miembros de la clase que tiene intención de cambiar a medida que mutable.

+2

Puedes hacer esto, pero es una mala práctica. –

12

Sí, esto es esperado. Si fue capaz de editar los objetos que ya están en el conjunto, es posible que ya no se aplique el orden de clasificación aplicado, lo que lleva a un comportamiento no definido.

Cuestiones relacionadas