Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Liste con Template e Ereditarietà
Forum - C/C++ - Liste con Template e Ereditarietà

Avatar
mannhe (Normal User)
Newbie


Messaggi: 2
Iscritto: 03/01/2011

Segnala al moderatore
Postato alle 15:14
Lunedì, 03/01/2011
Salve a tutti e buon anno..
Come da titolo, sto cercando di realizzare una struttura dati (Lista) utilizzando template e ereditarietà...
In particolare sto cercando di realizzare una lista con cursore unidirezionale.
Ho la classe astratta definita con Template sia per la lista che per ogni elemento della lista.
Nella classe figlia del nodo della lista ho inserito il puntatore al successivo.
nella classe figlia della lista, implemento la lista stessa mediante un vettore di nodi (etichetta+posizione successiva), la posizione successiva contenuta nel nodo indica l'indice dell'elemento del vettore che contiene l'elemento successivo, l'ultimo elemento ha come puntatore al successivo = -1;

Il problema che mi sta facendo impazzire è l'inserimento degli elementi nella lista, dopo aver creato la lista (forzo la creazione con 10 elementi) chiamo il metodo setLista() che è un metodo contenuto nella classe astratta.
setLista() richiama insLista() che è un metodo della classe figlia, in questo passaggio tutto quello che era stato instanziato prima sparisce e non trovando ciò che serve il programma va in errore....

posto il codice di tutto, sperando di essere stato il più chiaro possibile...
grazie anticipatamente

file CellaLista.h
Codice sorgente - presumibilmente C++

  1. #ifndef CELLALISTA_H
  2. #define CELLALISTA_H
  3. #include <stdlib.h>
  4.  
  5. using namespace std;
  6.  
  7. template <class T>
  8. class CellaLista{
  9.       public:
  10.              
  11.              typedef T tipoelem;
  12.              
  13.              CellaLista();
  14.              CellaLista(tipoelem );
  15.              ~CellaLista();
  16.              virtual void scriviCella(tipoelem);
  17.              virtual tipoelem leggiCella() const;
  18.              virtual bool operator==(CellaLista );
  19.      protected:
  20.              tipoelem etichetta;
  21. };
  22.      
  23.  
  24. template<class T>
  25. CellaLista<T>::CellaLista() {};
  26.  
  27. template<class T>
  28. CellaLista<T>::CellaLista(tipoelem label){
  29.      etichetta = label;
  30. };
  31.  
  32. template<class T>
  33. CellaLista<T>:: ~CellaLista(){};
  34.  
  35. template<class T>
  36. void CellaLista<T>::scriviCella (tipoelem label){
  37.      typename CellaLista<T>::tipoelem etichetta;
  38.      etichetta = label;
  39. };
  40.  
  41. template<class T>typename
  42. CellaLista<T>::tipoelem CellaLista<T>::leggiCella() const{
  43.       return (etichetta);
  44. };
  45.  
  46. template<class T>
  47. bool CellaLista<T>::operator==(CellaLista cella){
  48.      return(leggiCella() == cella.leggiCella());
  49. };
  50.  
  51. #endif



file CellaListaCur.h
Codice sorgente - presumibilmente C++

  1. #ifndef CELLALISTACUR_H
  2. #define CELLALISTACUR_H
  3. #include <stdlib.h>
  4. #include <iostream>
  5. #include "CellaLista.h"
  6. #define ERR -1
  7.  
  8. using namespace std;
  9.  
  10. template <class T>
  11. class CellaListaCur : public CellaLista<T>{
  12.       public:
  13.              typedef typename CellaLista<T>::tipoelem tipoelem;
  14.              typedef int posizione;
  15.            
  16.              CellaListaCur();
  17.              CellaListaCur(tipoelem);
  18.              CellaListaCur(tipoelem, posizione);
  19.              ~CellaListaCur();
  20.                          void scriviCella(tipoelem, posizione);
  21.              posizione getSuccessivo();
  22.              void setSuccessivo(posizione);
  23.       private:
  24.              posizione successivo;
  25. };
  26.      
  27. template<class T>
  28. CellaListaCur<T>::CellaListaCur(): CellaLista<T>::CellaLista(){
  29.                                    successivo = ERR;
  30. };
  31.  
  32. template<class T>
  33. CellaListaCur<T>::CellaListaCur(tipoelem label): CellaLista<T>::CellaLista(label){
  34.                                    successivo = ERR;
  35. };
  36.  
  37. template<class T>
  38. CellaListaCur<T>::CellaListaCur(tipoelem label,posizione p): CellaLista<T>::CellaLista(label){
  39.      successivo = p;
  40. };
  41.  
  42. template<class T>
  43. CellaListaCur<T>:: ~CellaListaCur()
  44. {};
  45.  
  46. template<class T>
  47. void CellaListaCur<T>::scriviCella(tipoelem label,posizione p) {
  48.      CellaLista<T>::scriviCella(label);
  49.      successivo=p;
  50. };
  51.  
  52. template<class T>          
  53. void CellaListaCur<T>::setSuccessivo(posizione p){
  54.      successivo=p;
  55.      };
  56.  
  57. template<class T>typename
  58. CellaListaCur<T>::posizione CellaListaCur<T>::getSuccessivo(){
  59.           return successivo;
  60.            };
  61.  
  62. #endif



file ListaLineare.h
Codice sorgente - presumibilmente C++

  1. #ifndef LISTALINEARE_H
  2. #define LISTALINEARE_H
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. template<class T,class P>
  8. class ListaLineare {
  9.       public:
  10.              typedef T tipoelem;
  11.              typedef P posizione;
  12.  
  13.              // operatori
  14.              virtual void creaLista() =0;
  15.              virtual bool listaVuota() const=0;
  16.              virtual tipoelem leggiLista(posizione) const=0;
  17.              virtual void scriviLista(tipoelem, posizione)=0;
  18.              virtual posizione primoLista() const=0;
  19.              virtual posizione ultimoLista() const=0;
  20.              virtual bool fineLista(posizione) const=0;
  21.              virtual posizione succLista(posizione) const=0;
  22.              virtual posizione predLista(posizione) const=0;
  23.              virtual void insLista(tipoelem, posizione)=0;
  24.              virtual void cancLista(posizione)=0;
  25.  
  26.              virtual void printLista();
  27.              virtual void setLista();
  28. };
  29.  
  30. template<class T,class P>
  31. void ListaLineare<T,P>:: printLista(){
  32.  
  33.       typename ListaLineare<T,P>::posizione p;
  34.       p=primoLista();
  35.       cout<<"\n\n ";
  36.       while(!fineLista(p)){
  37.             cout<<"["<<leggiLista(p)<<"]->";
  38.             p=succLista(p);
  39.       }
  40.       cout<<"[NULL]";
  41. }
  42.  
  43. template<class T,class P>
  44. void ListaLineare<T,P>:: setLista(){
  45.       typename ListaLineare<T,P>::tipoelem val;
  46.       int num;
  47.  
  48.       cout<<"\n Con quanti elementi vuoi inizializzare la lista? (max 10)";
  49.       cin>>num;
  50.       while(num<=0){
  51.             cout<<"\n Il numero degli elementi deve essere maggiore"
  52.                 <<" o uguale a 1.\n Inserire nuovamente il numero: ";
  53.             cin>>num;
  54.       }
  55.       cout<<" \n Inserisci ora il valore che vuoi assegnare a ciascun elemento:\n\n";
  56.       for(int i=1;i<=num;i++){
  57.             cin>>val;
  58.                         cout<<"\n in setLista - primoLista(): "<<primoLista()<<" \n\n";
  59.             insLista(val,primoLista());
  60.       }
  61. }
  62.  
  63. #endif



file ListaCur.h
Codice sorgente - presumibilmente C++

  1. #ifndef LISTACUR_H
  2. #define LISTACUR_H
  3. #include <stdlib.h>
  4. #include <iostream>
  5. #include "CellaListaCur.h"
  6. #include "ListaLineare.h"
  7. #define ERR -1
  8.  
  9. using namespace std;
  10.  
  11. template<class T>
  12. class Lista : public ListaLineare<T,int>{
  13.       public:
  14.              typedef typename ListaLineare<T,int>:: tipoelem tipoelem;
  15.              typedef typename ListaLineare<T,int>:: posizione posizione;            
  16.              
  17.  
  18.              Lista();
  19.              Lista(int);
  20.              Lista(const Lista<T>& );
  21.              ~Lista();
  22.              
  23.              // operatori
  24.              void creaLista();
  25.              bool listaVuota() const;
  26.              tipoelem leggiLista(posizione ) const;
  27.              void scriviLista(tipoelem , posizione );
  28.              posizione primoLista() const;
  29.                          posizione ultimoLista() const;
  30.              bool fineLista(posizione ) const;
  31.              posizione succLista(posizione ) const;
  32.              posizione predLista(posizione ) const;
  33.              void insLista(tipoelem, posizione );
  34.              void cancLista(posizione );
  35.              //sovraccarico di operatori
  36.              Lista<T>& operator=(const Lista<T>&);
  37.              bool operator==(const Lista<T> &) const;
  38.      
  39.    private:
  40.             void cambiaDimensione();
  41.             CellaListaCur<tipoelem> * elementi;
  42.                         posizione primo;
  43.             posizione primoVuoto;                      
  44.                         int dimensione; // dimensione del vettore che realizza la lista
  45.             int lunghezza; // lunghezza effettiva della lista            
  46. };
  47.  
  48. template <class T>
  49. Lista<T>::Lista(){
  50.    Lista(10);
  51. }
  52.    
  53. template <class T>
  54. Lista<T>::Lista(int dim){
  55.        
  56.         dimensione = dim;
  57.     primo = 0;
  58.         cout<<"\n COSTRUTTORE: dim: "<<dim<<" - dimensione: "<<dimensione<<" - primo: "<<primo<<"\n\n"<<endl;
  59.     elementi = new CellaListaCur<tipoelem>[dimensione];
  60.     if (elementi != NULL) {
  61.                 cout<<"\n elementi allocato \n\n"<<endl;
  62.                 int i;
  63.         for ( i=0; i<dimensione-1; i++) {
  64.             elementi[i].scriviCella(ERR,i+1);
  65.                         cout<<i<<". ";
  66.         }
  67.         elementi[dimensione].scriviCella(ERR,ERR);
  68.                 cout<<i<<". ";
  69.     }
  70.         else cout<<"\n elementi NON allocato \n\n"<<endl;
  71.     creaLista();
  72. }
  73.    
  74. template< class T >
  75. Lista< T >::Lista(const Lista<T>& lista) {
  76.     dimensione = lista.dimensione;
  77.     lunghezza = lista.lunghezza;
  78.     primo=lista.primo;
  79.     elementi = new CellaListaCur<T> [dimensione];
  80.     if (elementi != NULL) {
  81.         for (int i=0; i<dimensione; i++) {
  82.             elementi[i] = lista.elementi[i];
  83.         }
  84.     }
  85.  
  86. }
  87.  
  88. template <class T>
  89. Lista<T>::~Lista(){
  90.    // delete [] elementi ;
  91. }
  92.  
  93. template <class T>
  94. void Lista<T>::creaLista(){
  95.     lunghezza = 0;
  96.         cout<<"\n creaLista: dimensione: "<<dimensione<<" - primo: "<<primo<<" - lunghezza: "<<lunghezza<<"\n\n"<<endl;
  97. }
  98.  
  99. template <class T>
  100. bool Lista<T> ::listaVuota()const{
  101.         return (lunghezza==0);
  102. }
  103.    
  104. template <class T>
  105. void Lista<T>::scriviLista(tipoelem a,posizione p){
  106.         if((0 < p) && (p <= lunghezza+1))
  107.        elementi[p-1].scriviCella(a,p-1);
  108. }
  109.    
  110. template <class T> typename
  111. Lista<T>::tipoelem Lista<T>::leggiLista(posizione p) const {
  112.         if((0 < p) && (p <= lunghezza+1))
  113.                 return elementi[p-1].leggiCella();
  114.         else
  115.                 return p;
  116. }
  117.  
  118. template <class T> typename
  119. Lista<T>::posizione Lista<T>::primoLista()const{
  120.         return primo;
  121. }
  122.  
  123. template <class T> typename
  124. Lista<T>::posizione Lista<T>::ultimoLista() const{
  125.     typename Lista<T>::posizione pos;
  126.     for(pos=primo; !fineLista(elementi[pos].getSuccessivo()); pos=succLista(pos)){
  127.             pos=elementi[pos].getSuccessivo();
  128.     }
  129.         return pos;
  130. }
  131.  
  132. template <class T>
  133. bool Lista<T>::fineLista(posizione p) const{
  134.         if((0 < p) && (p <= lunghezza+1))
  135.        return (p==lunghezza+1);
  136.     else
  137.                 return false;
  138. }
  139.  
  140. template <class T> typename
  141. Lista<T>::posizione Lista<T>::succLista(posizione p) const {
  142.     if((0 < p) && (p <= lunghezza+1))          
  143.                 return elementi[p].getSuccessivo();
  144.     else{
  145.         cout<<"\n Non ci sono altri elementi";
  146.         return p;
  147.         }
  148. }
  149.  
  150. template <class T> typename
  151. Lista<T>::posizione Lista<T>::predLista(posizione p) const {
  152.      typename Lista<T>::posizione pos;    
  153.     if((1 < p) && (p <= lunghezza+1)){
  154.            for(pos=primo; elementi[pos].getSuccessivo()<p;pos=succLista(pos)){
  155.             pos=elementi[pos].getSuccessivo();
  156.        }
  157.        return pos;
  158.     }
  159.     else
  160.         return p;
  161. }
  162.        
  163. template <class T>
  164. void Lista<T>:: insLista(tipoelem a,posizione pv){
  165.      typename Lista<T>::posizione pos;
  166.  
  167.          cout<<"\ninsLista: tipoelem a: "<<a<<" - posizione pv: "<<pv<<"\n"<<endl;
  168.          cout<<"\ninsLista: dimensione: "<<dimensione<<" - primo: "<<primo<<" - lunghezza: "<<lunghezza<<"\n"<<endl;
  169.      if (lunghezza == dimensione){
  170.          cout<<"\nAUMENTA DIMENSIONE VETTORE LISTA\n"<<endl;
  171.          cambiaDimensione();
  172.      }
  173.      else
  174.          cout<<"\ninserisce elemento\n"<<endl;
  175.  
  176.          if((primo == ERR)){
  177.                 cout<<"\nprimo = ERR\n"<<endl;
  178.         primo=pv;
  179.                 elementi[0].scriviCella(a,pv);//scritto primo elemento della lista
  180.       }
  181.       else{
  182.             cout<<"\nprimo <> ERR\n"<<endl;
  183.             // trova ultima posizione, scorrendo tutta la lista
  184.             for (pos=primo; !fineLista(pos); pos=succLista(pos))
  185.             {}
  186.             pv=elementi[pos].getSuccessivo();
  187.             lunghezza++;  //incremento di conseguenza la variabile lunghezza
  188.       }
  189. }
  190.        
  191. template <class T>
  192. void Lista<T>::cancLista(posizione p){
  193.      if((0 < p) && (p <= lunghezza+1))
  194.                 if(!listaVuota()){
  195.                         //controllo se l'operazione è effettivamente eseguita su lista non vuota
  196.                 elementi[predLista(p)].setSuccessivo(elementi[p].getSuccessivo());
  197.             lunghezza--;//decremento di conseguenza la variabile lunghezza
  198.                 }
  199. }
  200.  
  201. template<class T>
  202. void Lista<T>::cambiaDimensione(){
  203.         cout<<"\ninizio cambiaDimensione\n"<<endl;
  204.     int  oldDim;
  205.     CellaListaCur<T> * elemTemp;
  206.    
  207.     oldDim = dimensione;
  208.     dimensione = dimensione *2;
  209.     cout<<"\nprima di inizializzare elemTemp \n"<<endl;
  210.     elemTemp = new  CellaListaCur<T> [dimensione];
  211.     cout<<"\nprima del for \n"<<endl;
  212.  
  213.     for (int i=0; i<oldDim; i++)
  214.                 elemTemp[i]= elementi[i];
  215.     cout<<"\ndopo del for \n"<<endl;
  216.     //delete [] elementi;
  217.     elementi = elemTemp;
  218.    
  219. }
  220.  
  221. /* operatore di assegnamento */
  222. template<class T>
  223. Lista<T>& Lista<T>::operator=(const Lista<T>& l){
  224.          if (this != &l){   // attenzione agli autoassegnamenti: l = l
  225.                  lunghezza = l.lunghezza;
  226.                  //delete this.elementi;
  227.                  for (int i=0; i<dimensione; i++)
  228.                          elementi[i] = l.elementi[i];
  229.          }
  230.          return *this;
  231. }
  232.  
  233. /* operatore di test di uguaglianza */
  234. template<class T>
  235. bool Lista<T>::operator==(const Lista<T> &l) const{
  236.         if (l.lunghezza != this.lunghezza)
  237.                 return false;
  238.     for (int i=0; i<dimensione; i++)
  239.                 if (this.elementi[i].leggiCella() != l.elementi[i].leggiCella())
  240.                         return false;
  241.     return true;
  242. }
  243.  
  244. #endif



infine il main.cpp
Codice sorgente - presumibilmente C++

  1. #include "stdafx.h"
  2. #include <cstdlib>
  3. #include <stdlib.h>
  4. #include <iostream>
  5. #include "ListaCur.h"
  6.  
  7. void wait(char *);
  8.  
  9. int _tmain(int argc, _TCHAR* argv[])
  10. {
  11.         Lista<int> dati;
  12.         cout<<"\nprima dei setLista nel main\n\n"<<endl;
  13.         dati.setLista();
  14.     dati.printLista();
  15.  
  16.     wait("\n\n Programma in stand by\n per continuare digita [Y]+[invio]: ");
  17.  
  18.     system("pause");
  19.     return EXIT_SUCCESS;
  20. }
  21.  
  22. void wait(char *msg){
  23.         char stop='?';
  24.     cout<<msg;
  25.     while(stop!='y' && stop!='Y')
  26.         cin>>stop;
  27. }



PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 20:30
Lunedì, 03/01/2011
se utilizzi PrimoLista all'interno dello scope di ListaLineare inevitabilmente verrà utilizzata la funzione PrimoLista virtual di ListaLineare...quindi una funzione che non ha istruzioni al suo interno...prova a cambiare lo scope della funzione, esplicitandolo...

PM Quote
Avatar
mannhe (Normal User)
Newbie


Messaggi: 2
Iscritto: 03/01/2011

Segnala al moderatore
Postato alle 9:15
Martedì, 04/01/2011
scusa cosa intendi  con cambiare lo scope della funzione?
PrimoLista() in ListaLineare è una funzione virtuale pura, che si lega direttamente a come è implementata la lista, ed è per questo che ha il codice definito nella classe che implementa la lista ossia ListaCur.

Ultima modifica effettuata da mannhe il 04/01/2011 alle 9:16
PM Quote