ciao a tutti, ho creato la struttura dati lista con cursore. è una lista derivata dove il costruttore invoca il costruttore della classe base (almeno dovrebbe) però quando compilo il test per verificare se i metodi sono corretti mi dà errore anche se penso sia fatto tutto corretto. posto i codici.
lista.h
listac.hcodice:#ifndef lista_h #define lista_h #include<iostream> #include<stdlib.h> using namespace std; template<class posizione, class tipoelem> class lista { public: lista(int); virtual void crealista() = 0; virtual bool listavuota() = 0; virtual posizione primolista() = 0; virtual bool finelista(posizione) = 0; virtual tipoelem leggilista(posizione) = 0; virtual void scrivilista(posizione, tipoelem) = 0; virtual posizione predlista(posizione) = 0; virtual posizione suclista(posizione) = 0; virtual void inslista(posizione, tipoelem) = 0; virtual void canclista(posizione) = 0; void stampalista(); void epuraordinata(); private: bool tipolista[3]; }; #endif template<class posizione, class tipoelem> lista<posizione, tipoelem>::lista(int tipolis) { /*questo costruttore serve per sapere di quale tipo è la lista (vettore, puntatore o cursore, in quanto alcuni metodi (inslista e canclista) svolgono azioni diverse in base al tipo di lista, cioè con la lista di puntatori i metodi aggiornano la posizione mentre con laa lista di vettori la posizione non viene aggiornata e quini c'è bisogno di aggiornarla dal metodo o funzione o programma che invoca il metodo. lista con vettore = 1 lista con puntatore = 2 lista con cursori = 3.*/ if(tipolis == 0) { tipolista[0] = true; tipolista[1] = tipolista[2] = false; } else if(tipolis == 1) { tipolista[1] = true; tipolista[0] = tipolista[2] = false; } else { tipolista[2] = true; tipolista[0] = tipolista[1] = false; } cout << "tipolista = " << tipolista[tipolis] << "\n\n"; } template<class posizione, class tipoelem> void lista<posizione, tipoelem>::stampalista() { posizione p = this->primolista(); while(!this->finelista(p)) { cout << this->leggilista(p) << "\n"; p = this->suclista(p); } if(tipolista[0] || tipolista[1]) //è una lista con vettore o puntatore? cout << this->leggilista(p) << "\n"; cout << "\n\n"; } template<class posizione, class tipoelem> void lista<posizione, tipoelem>::epuraordinata() { posizione p = this->primolista(); posizione q = this->suclista(p); while(!this->finelista(p)) { while(this->leggilista(q) == this->leggilista(p)) this->canclista(q); p = this->suclista(p); q = this->suclista(p); } }
testlistac.cppcodice:#ifndef listac_h #define listac_h #include<iostream> #include<stdlib.h> #include "lista.h" #define MAXDIM 100 using namespace std; template<class tipoelem> class listac : public lista<int, tipoelem> { public: typedef int posizione; listac(); void crealista(); bool listavuota(); posizione primolista(); bool finelista(posizione); tipoelem leggilista(posizione); void scrivilista(posizione, tipoelem); posizione predlista(posizione); posizione suclista(posizione); void inslista(posizione, tipoelem); void canclista(posizione); void sposta(posizione *, posizione *); private: typedef struct Nodo { posizione precedente; tipoelem elemento; posizione successivo; } nodoc; static nodoc *spazio; //static posizione listavuota; static nodoc *inizializzalistalibera(); static bool inizializzato; static posizione listalibera; static int lunglistalibera; posizione lista; int lunglista; }; #endif // INIZIALIZZAZIONE DEI MEMBRI STATICI template<class tipoelem> bool listac<tipoelem>::inizializzato = false; template<class tipoelem> typename listac<tipoelem>::nodoc *listac<tipoelem>::spazio = inizializzalistalibera(); template<class tipoelem> typename listac<tipoelem>::nodoc *listac<tipoelem>::inizializzalistalibera() { spazio = new nodoc[MAXDIM]; cout << "MAXDIM = " << MAXDIM << "\n"; if(!inizializzato) { for(int i = 0; i < MAXDIM; i++) { if(i == 0) { spazio[i].precedente = MAXDIM - 1; spazio[i].elemento = i; spazio[i].successivo = 1; } else { spazio[i].precedente = ((i - 1) % MAXDIM); spazio[i].elemento = i; spazio[i].successivo = ((i + 1) % MAXDIM); } } inizializzato = true; lunglistalibera = MAXDIM; } return spazio; } template<class tipoelem> typename listac<tipoelem>::posizione listac<tipoelem>::listalibera = 0; template<class tipoelem> void listac<tipoelem>::sposta(typename listac<tipoelem>::posizione *pos1, typename listac<tipoelem>::posizione *pos2) { posizione temp = *pos1; *pos1 = spazio[*pos1].successivo; spazio[spazio[temp].successivo].precedente = spazio[temp].precedente; spazio[spazio[temp].precedente].successivo = spazio[temp].successivo; spazio[temp].precedente = spazio[*pos2].precedente; spazio[temp].successivo = *pos2; spazio[spazio[*pos2].precedente].successivo = temp; spazio[*pos2].precedente = temp; *pos2 = temp; } template<class tipoelem> int listac<tipoelem>::lunglistalibera = 0; // COSTRUTTORE template<class tipoelem> listac<tipoelem>::listac() : lista<int, tipoelem>(2) { this->crealista(); } // METODI template<class tipoelem> void listac<tipoelem>::crealista() { lista = -1; lunglista = 0; } template<class tipoelem> bool listac<tipoelem>::listavuota() { return(lunglista == 0); } template<class tipoelem> typename listac<tipoelem>::posizione listac<tipoelem>::primolista() { return(lista); } template<class tipoelem> bool listac<tipoelem>::finelista(typename listac<tipoelem>::posizione pos) { return(spazio[pos].successivo == lista); } template<class tipoelem> tipoelem listac<tipoelem>::leggilista(typename listac<tipoelem>::posizione pos) { return(spazio[pos].elemento); } template<class tipoelem> void listac<tipoelem>::scrivilista(typename listac<tipoelem>::posizione pos, tipoelem elem) { spazio[pos].elemento = elem; } template<class tipoelem> typename listac<tipoelem>::posizione listac<tipoelem>::predlista(typename listac<tipoelem>::posizione pos) { return(spazio[pos].precedente); } template<class tipoelem> typename listac<tipoelem>::posizione listac<tipoelem>::suclista(typename listac<tipoelem>::posizione pos) { return(spazio[pos].successivo); } template<class tipoelem> void listac<tipoelem>::inslista(typename listac<tipoelem>::posizione pos, tipoelem elem) { if(this->listavuota()) { lista = listalibera; listalibera = spazio[listalibera].successivo; spazio[spazio[lista].precedente].successivo = listalibera; spazio[listalibera].precedente = spazio[lista].precedente; spazio[lista].precedente = lista; spazio[lista].successivo = lista; spazio[lista].elemento = elem; } else { if(pos == lista) { sposta(&listalibera, &lista); spazio[lista].elemento = elem; } else { sposta(&listalibera, &pos); spazio[pos].elemento = elem; } } lunglista++; lunglistalibera--; } template<class tipoelem> void listac<tipoelem>::canclista(typename listac<tipoelem>::posizione pos) { if(pos == lista) { spazio[lista].elemento = lista; sposta(&lista, &listalibera); } else { spazio[pos].elemento = pos; sposta(&pos, &listalibera); } lunglista--; lunglistalibera++; if(lunglista == 0) lista = -1; }
ora, gli errori che mi vengono segnalati sono alla riga 107 del file listac.h (in rosso) e sono i seguenti:codice:#include "listac.h" #include<iostream> #include<stdlib.h> using namespace std; int main() { listac<int> list(20); cout << "listavuota() = " << list.listavuota() << "\n"; cout << "primolista() = " << list.primolista() << "\n"; cout << "finelista(primolista()) = " << list.finelista(list.primolista()) << "\n"; cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n"; list.scrivilista(list.primolista(), 10); cout << "leggilista(primolista()) = " << list.leggilista(list.primolista()) << "\n"; cout << "predlista(primolista()) = " << list.predlista(list.primolista()) << "\n"; cout << "suclista(primolista()) = " << list.suclista(list.primolista()) << "\n"; cout << "primolista() = " << list.primolista() << "\n"; for(int i = 0; i < 10; i++) { list.inslista(list.primolista(), (i * 10)); } list.stampalista(); cout << "\n\n"; list.stampalista(); list.canclista(list.primolista()); listac<int>::posizione p = list.primolista(); for(int i = 0; i < 4; i++) p = list.suclista(p); list.canclista(p); list.stampalista(); system("cls"); int k; listac<int> list2; listac<int>::posizione p2 = list2.primolista(); for(int i = 0; i < 10; i++) { cin >> k; list2.inslista(p2, k); p2 = list2.suclista(p2); } list2.stampalista(); list2.epuraordinata(); list2.stampalista(); system("pause"); return 0; }
107 C:\Dev-Cpp\Lista\listac.h expected `(' before '<' token
107 C:\Dev-Cpp\Lista\listac.h expected `{' before '<' token
107 C:\Dev-Cpp\Lista\listac.h At global scope:
107 C:\Dev-Cpp\Lista\listac.h expected unqualified-id before '<' token
107 C:\Dev-Cpp\Lista\listac.h expected `,' or `;' before '<' token
quello che mi chiedo io è: perchè mi da questi errori dato che ho creato anche le liste con puntatori e vettore i cui costruttori sono fatti nello stesso modo del costruttore di questa lista??

Rispondi quotando