C/Visual C - Anyadir funcionalidad usando templates

 
Vista:

Anyadir funcionalidad usando templates

Publicado por Nelek (816 intervenciones) el 15/02/2007 09:26:18
Hola,

para poder optimizar mi proyecto y no tener que andar repitiendo metodos de lista implementados que tengo en varias clases, estoy ampliando una template de CMyList que encontre en Internet (http://www.codeproject.com/cpp/smartlist.asp).

Pero claro, es la primera vez que me pongo a crear funciones de "Template", me podriais decir si mis suposiciones son correctas??? De paso, que sirva tambien para resolver dudas que pueda tener la gente al respecto

// Remove a TYPE object from list
template<class TYPE, class ARG_TYPE>
inline void CMyList<TYPE, ARG_TYPE>::RemoveAtIndex(int nIndex)
{
ASSERT_VALID(this);
POSITION pos = FindIndex(nIndex);
ASSERT(pos);
RemoveAt(pos);
}

ASSERT_VALID(this);
Esto comprueba que la lista exista y que no este vacia a la vez, por lo que el if (IsEmpty ()) no es necesario

ASSERT(pos);
Esto comprueba que la posicion a la que se esta intentando acceder exite, es decir que existe un elemento en ese lugar y por lo tanto puede ser eliminado.

Pero ambas comprobaciones son solo en modo DEBUG y te lanzan la tipica ventana con un mensaje de error y las opciones, Ignorar (para seguir ejecutando el programa), Continuar (para ir al debugger) y Cancelar (para abandonar).

Luego pondre un boceto/prototipo de mi funcion para ver si me lo pudierais corregir.

Gracias por todo
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Boceto 1: FindAndReplaceElement

Publicado por Nelek (816 intervenciones) el 15/02/2007 10:11:37
Hola de nuevo, aqui os dejo el boceto de la primera funcion que quiero implementar. Me gustaria remarcar que estoy haciendo uso de funciones tanto de la propia CMyList que ya esta implementada (a localizar en el link del mensaje de arriba para el que la necesite) y del propio <afxtempl.h> del VC98.

template<class TYPE, class ARG_TYPE>
BOOL CMyList<TYPE, ARG_TYPE>::FindAndReplaceElement (const ARG_TYPE &searchValue, ARG_TYPE newValue)
{
ASSERT_VALID (this);
POSITION pos

CNode* pNode = m_pNodeHead; // start at head

for (; pNode != NULL; pNode = pNode->pNext)
{ if (CompareElements<TYPE>(&pNode->data, &searchValue))
{
pos = (POSITION)pNode;
ASSERT (pos);
break; //if found, return the position
}
else
{
pos = NULL;
return FALSE; //if not found, end notifying bad result
}
}

if ( pos != NULL) //When found replace with the old element with new one
{ SetAt (pos, newValue);
return TRUE;
}
}

Que os parece??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Primera metedura de pata detectada

Publicado por Nelek (816 intervenciones) el 15/02/2007 10:25:19
Me di cuenta de que tenia que haber inicializado "pos = NULL", que solo sea cambiado en caso de encontrar algo y que el else debia estar fuera del for, si no... me iba a salir de la funcion a la primera que no tuviera coincidencia. Lo que aun no tengo muy claro es si el uso que hago de elementos de la <afxtempl.h> (como el m_pHeadNode o demas) me llegaran por la herencia (son protegidos, asi que deberia, pero... a mi ya no me sorprende nada en cuanto a fallos se refiere ;) :P)

Aqui esta la nueva version:

template<class TYPE, class ARG_TYPE>
BOOL CMyList<TYPE, ARG_TYPE>::FindAndReplaceElement (const ARG_TYPE &searchValue, ARG_TYPE newValue)
{
ASSERT_VALID (this);
POSITION pos = NULL;

CNode* pNode = m_pNodeHead; // start at head

for (; pNode != NULL; pNode = pNode->pNext)
{
if (CompareElements<TYPE>(&pNode->data, &searchValue))
{
pos = (POSITION)pNode;
ASSERT (pos);
break; //if found, return the position
}
}

if ( pos != NULL) //When found replace with the old element with new one
{
SetAt (pos, newValue);
return TRUE;
}
else
return FALSE;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

La version mas simple

Publicado por Nelek (816 intervenciones) el 15/02/2007 10:39:40
Nada, resulta que al final me he dado cuenta de que estaba complicandome la vida y haciendo faena extra. Aunque me ha servido para entender un par de cosas (o eso creo, haberlas entendido). Aqui dejo la version mas sencilla de todas. Notese la ausencia del "&" en la definicion del "searchValue". Deberia volver a ponerlo??

template <class TYPE, class ARG_TYPE>
BOOL CMyList<TYPE, ARG_TYPE>::FindAndReplaceElement (const ARG_TYPE searchValue, ARG_TYPE newValue)
{
ASSERT_VALID (this);
POSITION pos = NULL;

pos = Find (searchValue);

if ( pos != NULL) //When found replace with the old element with new one
{
SetAt (pos, newValue);
return TRUE;
}
else
return FALSE;
}

Espero vuestros comentarios y, si no os importa, vuestras correcciones y explicaciones en los fallos que seguramente he tenido en la version anterior y posiblemente en esta :P

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar