Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Kherom en 5 Enero 2013, 05:11 am



Título: Problema con iterador
Publicado por: Kherom en 5 Enero 2013, 05:11 am
Buenas, tengo un una clase que contiene un set de objetos, y un método encargado de llamar al método draw() de todos los objetos:

Código
  1.            for (set<cube>::iterator i=cubes.begin(); i!=cubes.end(); i++)
  2.            {
  3.                /*cube  p = (*i);
  4.                 p.draw();*/
  5.                i->draw();
  6.            }

Tal y como está el compilador me dice:

Cita de: Compilador
[Warning] passing 'const cube' as 'this' argument of 'void cube::draw()' discards qualifiers [-fpermissive]

Con el flag -fpermissive se queda sólo en Warning, pero sin ella es un error y no compila. Sustituyendo el i->draw() por la parte comentada funciona, pero haciendo una copia del objeto, y quiero evitar eso.

¿Alguna idea de qué tengo que hacer?


Título: Re: Problema con iterador
Publicado por: Kherom en 5 Enero 2013, 05:24 am
Perdón, ese error se solucionaba marcando la función draw() como const, mi problema es en otra:

Código
  1.        void addCube(int x, int y, int z){
  2.            int bx=x/10, by=y/10, bz=z/10;
  3.         cubeBox temp(bx,by,bz);
  4.            if ( cubeBoxData.find(temp) == cubeBoxData.end() ){
  5.             cout << "cubeBox no existe" << endl;
  6.                cubeBoxData.insert(temp);
  7.            }
  8.            set<cubeBox>::iterator i = cubeBoxData.find(temp);
  9.    i->addCube(x,y,z);
  10.        }

En éste caso en la línea 9 tengo el mismo error:

Cita de: Compilador
[Warning] passing 'const cubeBox' as 'this' argument of 'const void cubeBox::addCube(int, int, int)' discards qualifiers [-fpermissive]

Pero no se soluciona añadiendo "const" a addCube() ya que de hecho modifica la clase.

Además, aquí el truco de copiar el contenido a otro objeto no sirve ya que tengo que modificar el objeto contenido en el set y no otro.



Título: Re: Problema con iterador
Publicado por: Kherom en 5 Enero 2013, 19:56 pm
Vale ya lo he solucionado: Resulta que los iteradores de los set son constantes para evitar que al modificar el objeto se pierda el orden, por ello tenía que hacer un const_cast (ya que en mi caso no modifico las variables que dependen del orden):

Código
  1. const_cast<cubeBox&>(*i).addCube(x,y,z);