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++ - 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?

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?

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....

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?

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

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.....

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
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.

PM Quote
Avatar
gigisoft (Member)
Guru


Messaggi: 696
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...

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo