Classe Lista con template

slevyn
ragazzi ho un problema di compilazione per quanto riguarda questo programma che realizza una lista trattata come un vettore . Vi posto il file .h

#ifndef _CELLA_H
#define _CELLA_H
using namespace std;


template <class T >
class cella {
public:
typedef T tipoelem;
cella();
void setElemento(tipoelem);
tipoelem getElemento();
private:
tipoelem elemento;
};


template <class T >
cella <T > :: cella () {} ;


template<class T>
void cella <T>::setElemento(tipoelem x)
{
    elemento = x ;
}


template<class T>
T cella<T>:: getElemento()
{
    return elemento;
}



////////////////////////////////////////////////////////
const int DIM = 200;
typedef int posizione;

template <class T>
class lista
{
    public:
    typedef T tipoelem;
    lista();
    void creaLista();
    bool fineLista(posizione);
    bool listaVuota();
    void scriviLista(tipoelem,posizione);
    tipoelem leggiLista(posizione);
    posizione primoLista();
    posizione predLista(posizione);
    posizione succLista(posizione);
    void insLista(tipoelem,posizione);
    void cancLista(posizione);
    private:
    tipoelem listone[DIM];
    int lunghezza;
};

template<class T>
lista<T>::lista() {
    creaLista(); }


template<class T>
void lista<T>:: creaLista()
{
    lunghezza = 0;
}


template<class T>
bool lista<T>::listaVuota()
{
    if(lunghezza==0)
    return true;
}


template<class T>
void lista<T>::scriviLista(tipoelem elem , posizione p )
{
    listone[p].setElemento(elem);
}


template<class T>
T lista<T>::leggiLista(posizione p)
{
    return listone[p].getElemento();
}


template<class T>
bool lista<T>::fineLista(posizione p)
{
    if ( p == lunghezza + 1)
    return true;
}


template<class T>
posizione lista<T>::primoLista()
{
    return (1);
}


template<class T>
posizione lista<T>::succLista(posizione p)
{
    return (p + 1) ;
}

template<class T>
posizione lista<T>::predLista(posizione p)
{
    return (p - 1) ;
}



template<class T>
void lista<T>::insLista(tipoelem elem,posizione p)
{
    for ( int i= lunghezza ; i>=p; i -- ){
     listone[i]= listone[i-1];
     listone[p-1].setElemento(elem);
      lunghezza++ ;
    }
}



template<class T>
void lista<T>::cancLista(posizione p)
{
   if(!listaVuota()){
   for(int i = p - 1 ; i <(lunghezza-1) ; i++ ) {
                          listone[i] = listone[i+1];
                          lunghezza--;
                                }
   }
}

#endif

testando la classe nel main , l'unico errore di compilazione è il seguente :
C:\Users\hp\Desktop\Lista con Vettore\cella.h|130|error: request for member `setElemento' in `((lista*)this)->lista::listone[(p - 1)]', which is of non-class type `int'| ...Non riesco a venirne a capo

Praticamente è un errore nella funzione " insLista(tipoelem,posizione) "

Risposte
_overflow_1
Beh in verità ci sono un bel po' di cose da correggere, non esegui nessun controllo sugli indici ecc. ecc... (comunque può essere che non hai ancora finito di definire la classe).

Per il tuo problema, allora tu prima crei una classe "cella" dotata di alcuni metodi, poi però nella classe lista definisci listone come tipoelem, e poi provi ad usare i metodi di cella tipo getElemento, ma ovviamente così non può funzionare, in realtà dovresti dichiarare listone come un vettore di cella, quindi dovresti fare qualcosa del genere:

cella listone[DIM];

al posto di

tipoelem listone[DIM];

Secondo me è un modo un po' contorto di definire la classe lista, ma probabilmente non ho capito bene come alla fine vuoi strutturare il programma ;)

così ora dovrebbe compilare, torno a ripetere però che dovresti correggere ancora un bel po' di cose...

slevyn
E' verooo ...non ci avevo fatto caso..che svista pazzesca...ti ringrazio :D

_overflow_1
di niente ;)

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.