Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas Con 'const'

Iniciado por O2, 29 de Octubre de 2003, 03:14:25 PM

« anterior - próximo »

O2

 Buenas:

Recientemente he echo unas modificaciones en un template de lista doblemente enlazada que uso para permitir la carga dinamica de texturas, sonidos, etc...

Os pego el codigo de la clase nodo:


template<typename Type>
class mListNode
{
public:

mListNode()
{
 m_Data=NULL;
 m_Next=NULL;
 m_Prev=NULL;
}

mListNode(const Type Data,
   const mListNode<Type> *Next=NULL,
   const mListNode<Type> *Prev=NULL)
{
 m_Data=Data;
 m_Next=(mListNode<Type>*)Next;
 m_Prev=(mListNode<Type>*)Prev;
}

~mListNode()
{
 m_Data=NULL;
 m_Next=NULL;
 m_Prev=NULL;
}

inline void Clear()
{
 m_Data=NULL;
 m_Next=NULL;
 m_Prev=NULL;
}

inline void SetData(const Type Data=NULL)
{
 m_Data=Data;
}

inline void SetNext(const mListNode<Type> *Next=NULL)
{
 m_Next=(mListNode<Type>*)Next;
}

inline void SetPrev(const mListNode<Type> *Prev=NULL)
{
 m_Prev=(mListNode<Type>*)Prev;
}

inline const Type GetData()
{
 return m_Data;
}

inline const mListNode<Type> *GetNext()
{
 return m_Next;
}

inline const mListNode<Type> *GetPrev()
{
 return m_Prev;
}

private:

Type m_Data;
mListNode<Type> *m_Next;
mListNode<Type> *m_Prev;
};


Luego, en el template lista hago algo tal que asi:



//Siendo m_Iterator una variable miembro de la lista, de tipo mListNode<Type>*

m_Iterator->GetNext()->SetPrev(m_Iterator->GetPrev());


Y es en esa linea (Y en todas las del mismo estilo) donde me da error al compilar. Esto ocurre desde que hice que los metodos GetNext y GetPrev del template mListNode devolvieran un puntero a nodo const, para evitar que pueda ser modificado.

El error es el siguiente:
error C2662: 'mListNode::SetPrev' : cannot convert 'this' pointer from 'const mListNode' to 'mListNode &'

¿Por que da este error? ¿Acaso no puedo llamar a un metodo de un puntero a clase retornado como const? En ningun momento estoy intentando modificarlo...

Espero que alguien pueda explicarme por que da este error, porque no lo entiendo, aunque supongo que la forma de solucionarlo es con algun cast, pero tampoco se donde colocarlo.

Muchas gracias de antemano, y un saludo!!

MChiz

 Hola!

Si que puedes llamar a un metodo de una clase const, pero este ha de tener el modificador const detras de la declaracion:

inline void SetPrev( const mListNode< Type > *Prev = NULL ) const {
m_Prev = ( mListNode< Type >* )Prev;
}

De todas formas esto no te va a servir, porque poner ese const delante indica que 'this' es constante, asi que no podras modificar m_Prev. Para hacer esto deberas quitar el const de tu metodo 'GetNext'.

Un saludote!

Zaelsius

 ¿Por qué no usas std::list? Alguna razón en especial?

O2

 MChiz: Tienes razón, estaba intentando hacer algo que no es posible, ya que si SetNext/SetPrev modifican variables miembro, no puedo llamarlas desde un puntero const.

ZaelSius: Pues prefiero hacerlo a mano simplemente para aprender :)

Gracias a ambos.

MChiz







Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.