Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Plantilla y Clase

Estas en el tema de Plantilla y Clase en el foro de C/C++ en Foros del Web. Saludos, podria alguien, porfavor, resolver esta duda. Sobre la siguiente linea de codigo: Tabla<Cadena> TablaCad(nElementos); Entiendo que "TablaCad" es un objeto de clase "Cadena" creado ...
  #1 (permalink)  
Antiguo 17/09/2008, 18:12
 
Fecha de Ingreso: julio-2008
Mensajes: 18
Antigüedad: 15 años, 9 meses
Puntos: 0
Plantilla y Clase

Saludos, podria alguien, porfavor, resolver esta duda.

Sobre la siguiente linea de codigo:

Tabla<Cadena> TablaCad(nElementos);

Entiendo que "TablaCad" es un objeto de clase "Cadena" creado a partir de una Plantilla llamada "Tabla".

El problema surge al intentar comprender el recorrido que hace la linea de codigo anterior hasta la publicaciòn del resultado en pantalla.

Al parecer se inicia con el constructor de "Tabla", entregando el valor de nElementos como dato para el parametro del constructor-Tabla(int nElem)-:
Cita:
template <class T>
class Tabla {
public:
Tabla(int nElem);
~Tabla();
T& operator[](int indice) { return pT[indice]; }
int NElementos() const { return nElementos; }

private:
T *pT;
int nElementos;
};

// Definición:
template <class T>
Tabla<T>::Tabla(int nElem) : nElementos(nElem) {
pT = new T[nElementos];
}

template <class T>
Tabla<T>::~Tabla() {
delete[] pT;
}

Con lo anterior se logra la memoria para los datos que seran guardados en el objeto, y simular un array mediante la sobrecarga del operador "[]".

Pero desde este punto no entiendo, como se utiliza el codigo de la clase "Cadena".

Cita:
class Cadena {
public:
Cadena(char *cad) {
cadena = new char[strlen(cad)+1];
strcpy(cadena, cad);
}
Cadena() : cadena(NULL) {}
Cadena(const Cadena &c) : cadena(NULL) {*this = c;}
~Cadena() { if(cadena) delete[] cadena; }
Cadena &operator=(const Cadena &c) {
if(this != &c) {
if(cadena) delete[] cadena;
if(c.cadena) {
cadena = new char[strlen(c.cadena)+1];
strcpy(cadena, c.cadena);
}
else cadena = NULL;
}
return *this;
}
const char* Lee() const {return cadena;}

private:
char *cadena;
};
1)¿Cual de los tres constructores se utilizara?
2)¿Que argumentos se utilizaran?
3)Y en general, agradeceria, cualquier otra explicaciòn del uso del codigo anterior.

El ejercicio viene de la pagina:
http://www.conclase.net/c/curso/index.php?cap=040b
Es el ultimo.

Gracias por la paciencia y la ayuda.
  #2 (permalink)  
Antiguo 18/09/2008, 05:33
Avatar de Mort20  
Fecha de Ingreso: junio-2008
Ubicación: Roca Casterly
Mensajes: 141
Antigüedad: 15 años, 11 meses
Puntos: 2
Respuesta: Plantilla y Clase

Por partes, tu problemas no está con la plantilla Tabla si no con la clase Cadena.
Las preguntas:
1 y 2) Esto es la sobrecarga de funciones permitida en el C++. Si el programa invoca una cadena con "Cadena cad("hola");" usará el primer constructor ya que es el único que permite un único argumento que sea un string. Si hubieses usado "Cadena cad();" usaría el que no tiene ningún argumento. Es decir, la creación del objeto es la que indica que constructor usar. Lo mismo para cualquier otro tipo de función.
3) Usando la clase Cadena, un ejemplo sería:
Código:
/* includes y declaración de la clase */
int main ()
{
     Cadena cad("hola");
     cout << cad.Lee() << endl; //imprime hola
}
Para la plantilla, lo único que pasa es que esa tabla, al ser una forma de hacer arrays(lo vemos por su implementación), lo que pasa es que el tipo no definido T, se transforma al tipo Cadena. Es decir, tendremos un array de objetos tipo Cadena, cada uno de los cuales tendrá las funciones públicas de Cadena disponibles y las de la plantilla Tabla.
__________________
Un Lannister siempre cumple sus promesas
  #3 (permalink)  
Antiguo 19/09/2008, 16:18
 
Fecha de Ingreso: julio-2008
Mensajes: 18
Antigüedad: 15 años, 9 meses
Puntos: 0
Respuesta: Plantilla y Clase

Mort20, gracias por la ayuda.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 18:18.