elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [SOLUCIONADO] Plantilla de una clase con estructuras
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [SOLUCIONADO] Plantilla de una clase con estructuras  (Leído 1,573 veces)
jesules79

Desconectado Desconectado

Mensajes: 2


Ver Perfil
[SOLUCIONADO] Plantilla de una clase con estructuras
« en: 18 Diciembre 2013, 22:05 pm »

Hola a todos,

Tengo hecha una practica sobre la clase List, que implementa una lista de enteros. Ahora tengo que modificarla para que acepte cualquier tipo de dato mediante plantillas.

He visto el uso de las plantillas de clases en C++, y he mirado ejemplos en internet.

El caso es que uso la estructura Node, que representa un nodo de la lista que contiene el elemento y un puntero al siguiente elemento. El elemento debe ser de cualquier tipo.

El caso es que lo aplico y me da un montón de errores que no sé en qué fallo.

list.h

Código:
#ifndef _LIST_H_
#define _LIST_H_

template <class T1>
struct Node {
    T1 info;
    Node *next;
};

template <class T2>
class List {
    private:
        T2 *_head, *_tail, *_cursor;
        int _t;
    public:
        List();
        void insertBegin(int i);


};

list.cpp

Código:
#include "list.h"
#include <cstdlib>      //Para NULL

template <class T2>
List<T2>::List() {
    _head = _cursor = _tail = NULL;
    _t = 0;
}

template <class T2>
void List::insertBegin(int i) {
    if(empty()) {           //Lista esta vacia
        T2 *aux;
        aux = new T2;
        aux->info = i;
        aux->next = _head;
        _head = _cursor = _tail = aux;
        _t++;
    }
    else {                  //Lista no esta vacia
        T2 *aux;
        aux = new T2;
        aux->info = i;
        aux->next = _head;
        _head = _cursor = aux;
        _t++;
    }
}

menulista.cpp

Código:
#include "list.h"
#include <iostream>
#include <cstdlib>      //Para system()
#include <new>          //Para bad_alloc

using namespace std;

void showmenu();

int main() {
    List<int> lint;
    List<char> lchar;




    return 0;
}

A ver si me podeis ayudar.

Un saludo


« Última modificación: 18 Diciembre 2013, 23:59 pm por jesules79 » En línea

jesules79

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Plantilla de una clase con estructuras
« Respuesta #1 en: 18 Diciembre 2013, 23:58 pm »

Bueno, pues ya está solucionado,

Aparte de que no estaba bien el código (mirar cómo ha tratado la estructura y el resto), es que me daba el siguiente error:

Código:
collect2: ld devolvió el estado de salida 1

El compilador necesita tener el código que implementa la función siempre visible para crear la versión personalizada al tipo de T sobre la marcha cuando la necesita.

Cuando separas .h y .cpp y en main.cpp haces los  includes de los .h, el compilador no sabe como generar el cuerpo personalizado ni a char ni a int, y por lo tanto quedan indefinidos. Por eso protesta.

La solución es poner en el mismo .h de la plantilla todas las definiciones y las implementaciones, ya sea como funciones inline, si son cortas, o despues de la definición de la clase si son más complicadas, dejando la definición de la clase más limpia.

Pongo el codigo para que sirva de ejemplo por si a alguien le sirve

list.h

Código:
#ifndef _LIST_H_
#define _LIST_H_

#include <cstdlib>

#define OK 1
#define ERROR 0

template <class T>
struct Node {
    T info;
    Node *next;
};

template <class T>
class List {
    private:
        Node<T> *_head, *_tail, *_cursor;
        int _t;
    public:
        List();
        bool empty();
        void insertBegin(T i);


};


template <class T>
List<T>::List() {
    _head = _cursor = _tail = NULL;
    _t = 0;
}

template <class T>
void List<T>::insertBegin(T i) {
    if(empty()) {           //Lista esta vacia
        T *aux;
        aux = new T;
        aux->info = i;
        aux->next = _head;
        _head = _cursor = _tail = aux;
        _t++;
    }
    else {                  //Lista no esta vacia
        T *aux;
        aux = new T;
        aux->info = i;
        aux->next = _head;
        _head = _cursor = aux;
        _t++;
    }
}

template <class T>
bool List<T>::empty() {
    if(_head == NULL) {
        return true;
    }
    else {
        return false;
    }
}


menulista.cpp

Código:
#include "list.h"
#include <iostream>

using namespace std;

int main() {
    List<int> lint;
    List<char> lchar;

    return 0;
}

Espero que a alguien le sirva de ayuda


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con clase Scanner -solucionado.
Java
carlitos.dll 1 2,528 Último mensaje 13 Septiembre 2008, 20:40 pm
por carlitos.dll
[SOLUCIONADO] problema con clase
.NET (C#, VB.NET, ASP)
<sylar> 4 3,172 Último mensaje 1 Junio 2009, 00:07 am
por Hadess_inf
Plantilla de clase c++
Programación C/C++
darkvidhack 1 1,608 Último mensaje 22 Octubre 2011, 15:25 pm
por do-while
Problema con ejercicio de clase (Estructuras de selección)
Programación C/C++
foreground 5 2,794 Último mensaje 7 Marzo 2013, 22:50 pm
por leosansan
estructuras dentro de una clase
Programación C/C++
fafafa01 3 2,236 Último mensaje 20 Septiembre 2017, 19:51 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines