Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Classi Template
Forum - C/C++ - Classi Template

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 22:25
Venerdì, 13/03/2009
Ho creato una classe template che eredita da un'altra classe template.
Ho riscontrato due problemi:

1)Se metto l'implementazione dei metdi in un file .cpp separato mi viene dato errore. Avevo intenzione di inserire le due classi in una dll ma come faccio a non far vedere il mio codice se non posso separare .h e .cpp?

2)Per creare una dll con le classi template la procedura è la stessa che per le classi normali?


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 22:40
Venerdì, 13/03/2009
Il codice? L'errore?


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 8:48
Sabato, 14/03/2009
La questione del suddividere nei due file l'ho risolta, s vede che ieri ero troppo stanco per ragionare(devo aver fatto qualche cavolata :rotfl: )

rimane solo il procedimento per la creazione della dll....


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 8:58
Sabato, 14/03/2009
rettifico, credevo di aver risolto.

Allora il mio Algo.h è così:

Codice sorgente - presumibilmente C++

  1. const int STD_ARR_LEN = 20;
  2.  
  3. //******************************//
  4. //inizio classe ARRAY                   //
  5. //******************************//
  6. template<class T>
  7. class Array
  8. {
  9.         protected:
  10.                 T *_arr;
  11.                 int _len;
  12.         public:
  13.                 Array(T arr[], int len);
  14.                 ~Array();
  15.                 T * Reverse();
  16.                 T Last();
  17.                 T First();
  18.                 T * Copy();
  19. };
  20.  
  21. //******************************//
  22. //inizio classe SORT                    //
  23. //******************************//
  24. template<class T>
  25. class Sort:public Array<T>
  26. {
  27. public:
  28.         Sort(T arr[], int len);
  29.         ~Sort();
  30.         T * InsertionSort();
  31.         T * BubbleSort();
  32. };



invece il mio Algo.cpp è così:

Codice sorgente - presumibilmente C++

  1. #include"Algo.h"
  2.  
  3. template<class T>
  4. Array<T>::Array(T arr[], int len)
  5. {
  6.         _arr = arr;
  7.         _len = len;
  8. }
  9.  
  10. template<class T>
  11. Array<T>::~Array()
  12. {
  13. //      delete[] _arr;
  14. }
  15.  
  16. template<class T>
  17. T * Array<T>::Reverse()
  18. {
  19.         T *new_arr = new T[_len];
  20.         int i;
  21.         int j;
  22.        
  23.         for(i = _len - 1, j = 0; j < _len; j++, i--)
  24.                 *(new_arr + i) = *(_arr + j);
  25.                
  26.         return new_arr;
  27. }
  28.  
  29. template<class T>
  30. T * Array<T>::Copy()
  31. {
  32.         int i;
  33.         T *new_arr = new T[_len];
  34.        
  35.         for(i = 0; i < _len; i++)
  36.                 *(new_arr + i) = *(_arr + i);
  37.                
  38.         return new_arr;
  39. }
  40.  
  41. template<class T>
  42. T Array<T>::Last()
  43. {
  44.         int ret = _len - 1;
  45.         return *(_arr + ret);
  46. }
  47.  
  48. template<class T>
  49. T Array<T>::First()
  50. {
  51.         return *(_arr);
  52. }
  53.  
  54.  
  55. template<class T>
  56. Sort<T>::Sort(T arr[], int len):Array(arr, len)
  57. {
  58. }
  59.  
  60. template<class T>
  61. T * Sort<T>::InsertionSort()
  62. {
  63.         int i;
  64.         int j;
  65.         T aux;
  66.         T *new_arr = Copy();
  67.        
  68.         for(i = 0; i < _len; i++)
  69.         {
  70.                 aux = *(new_arr + i);
  71.                 j = i - 1;               
  72.                 while( j >= 0 && *(new_arr + j) > aux)
  73.                 {
  74.                         *(new_arr + j + 1) = *(new_arr + j);
  75.                         j--;
  76.                 }
  77.                 *(new_arr + j + 1) = aux;
  78.         }
  79.         return new_arr;
  80. }
  81.  
  82. template<class T>
  83. T * Sort<T>::BubbleSort()
  84. {
  85.         int i;
  86.         int len = _len;
  87.         T tmp;
  88.         T *new_arr = Copy();
  89.  
  90.         while(len > 1)
  91.     {
  92.         for (i = 0; i < _len - 1; i++)
  93.         {
  94.                         if (*(new_arr + i) > *(new_arr + i + 1))
  95.                         {
  96.                                 tmp = *(new_arr + i);
  97.                                 *(new_arr + i) = *(new_arr + i + 1);
  98.                                 *(new_arr + i + 1) = tmp;
  99.                         }        
  100.         }
  101.                 len--;
  102.     }
  103.         return new_arr;
  104. }



nel main chiamo:

Codice sorgente - presumibilmente C++

  1. #include"Algo.h"
  2.  
  3. #include<iostream>
  4. using namespace std;
  5.  
  6. void main()
  7. {
  8.         int vett[] = {3,2,1,7,5};
  9.         int *j;
  10.         int i = 0;
  11.        
  12.         Sort<int> *ordina = new Sort<int>(vett,5);
  13.        
  14.         j = ordina->BubbleSort();
  15.  
  16.         while(i < 5)
  17.         {
  18.                 cout<<*(j+i);
  19.                 i++;
  20.         }
  21.         cout<<endl;
  22. }



L'errore è:

unresolved external symbol "public: __thiscall Sort<int>::~Sort<int>(void)" (??1?$Sort@H@@QAE@XZ)

e

unresolved external symbol "public: __thiscall Sort<int>::Sort<int>(int * const,int)" (??0?$Sort@H@@QAE@QAHH@Z)

cosa può essere?


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 11:12
Sabato, 14/03/2009
Non devi dividere nei file .cpp e .h il sorgente se usi classi template.

Deve stare tutto nel .h


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 12:11
Sabato, 14/03/2009
Testo quotato

Postato originariamente da lorenzo:
Avevo intenzione di inserire le due classi in una dll ma come faccio a non far vedere il mio codice se non posso separare .h e .cpp?



la mia domanda rimane questa allora.....


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 12:12
Sabato, 14/03/2009
Testo quotato

Postato originariamente da lorenzo:
Avevo intenzione di inserire le due classi in una dll ma come faccio a non far vedere il mio codice se non posso separare .h e .cpp?



la mia domanda rimane questa allora.....


scusate mi ha sdoppiato il post

Ultima modifica effettuata da lorenzo il 14/03/2009 alle 12:13


"There's no point in being exact about something if you don't even know what you're talking about."

JOHN VON NEUMANN


Siamo italiani NO??
Allora scriviamo in ITALIANO!!!!
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 12:37
Sabato, 14/03/2009
Dovrai distribuire il .h completo del codice.

Le classi template non esistono finche' non sono istanziate con un particolare tipo, quindi non esiste del codice da inserire in una dll (ed ecco perche' non puoi suddividere le dichiarazioni dalle definizioni in file diversi).

Per capirci, con MFC di Microsoft, puoi vedere tranquillamente il contenuto del file

afxtempl.h

ad esempio, per i CArray troverai

Codice sorgente - presumibilmente C/C++

  1. template<class TYPE, class ARG_TYPE>
  2. CArray<TYPE, ARG_TYPE>::CArray()
  3. {
  4.         m_pData = NULL;
  5.         m_nSize = m_nMaxSize = m_nGrowBy = 0;
  6. }



e tutto il resto.


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 695
Iscritto: 11/10/2008

Segnala al moderatore
Postato alle 11:56
Lunedì, 16/03/2009
Testo quotato

Postato originariamente da theprogrammer:

Dovrai distribuire il .h completo del codice.

Le classi template non esistono finche' non sono istanziate con un particolare tipo, quindi non esiste del codice da inserire in una dll (ed ecco perche' non puoi suddividere le dichiarazioni dalle definizioni in file diversi).




La sintassi precisa non la ricordo, ma c'era una soluzione che permetteva di deparare i file, a patto di decidere a priori i tipi con cui far funzionare la classe template ( dichiarandoli preventivamente ), se si e' disposti ad accettare questo compromesso...


Le cose si fanno per bene o non si fanno affatto
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo