lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
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?
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Il codice? L'errore?
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
La questione del suddividere nei due file l'ho risolta, s vede che ieri ero troppo stanco per ragionare(devo aver fatto qualche cavolata )
rimane solo il procedimento per la creazione della dll....
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
rettifico, credevo di aver risolto.
Allora il mio Algo.h è così:
Codice sorgente - presumibilmente C++ |
const int STD_ARR_LEN = 20; //******************************// //inizio classe ARRAY // //******************************// template<class T> class Array { protected: T *_arr; int _len; public: Array(T arr[], int len); ~Array(); T * Reverse(); T Last(); T First(); T * Copy(); }; //******************************// //inizio classe SORT // //******************************// template<class T> class Sort:public Array<T> { public: Sort(T arr[], int len); ~Sort(); T * InsertionSort(); T * BubbleSort(); };
|
invece il mio Algo.cpp è così:
Codice sorgente - presumibilmente C++ |
#include"Algo.h" template<class T> Array<T>::Array(T arr[], int len) { _arr = arr; _len = len; } template<class T> Array<T>::~Array() { // delete[] _arr; } template<class T> T * Array<T>::Reverse() { T *new_arr = new T[_len]; int i; int j; for(i = _len - 1, j = 0; j < _len; j++, i--) *(new_arr + i) = *(_arr + j); return new_arr; } template<class T> T * Array<T>::Copy() { int i; T *new_arr = new T[_len]; for(i = 0; i < _len; i++) *(new_arr + i) = *(_arr + i); return new_arr; } template<class T> T Array<T>::Last() { int ret = _len - 1; return *(_arr + ret); } template<class T> T Array<T>::First() { return *(_arr); } template<class T> Sort<T>::Sort(T arr[], int len):Array(arr, len) { } template<class T> T * Sort<T>::InsertionSort() { int i; int j; T aux; T *new_arr = Copy(); for(i = 0; i < _len; i++) { aux = *(new_arr + i); j = i - 1; while( j >= 0 && *(new_arr + j) > aux) { *(new_arr + j + 1) = *(new_arr + j); j--; } *(new_arr + j + 1) = aux; } return new_arr; } template<class T> T * Sort<T>::BubbleSort() { int i; int len = _len; T tmp; T *new_arr = Copy(); while(len > 1) { for (i = 0; i < _len - 1; i++) { if (*(new_arr + i) > *(new_arr + i + 1)) { tmp = *(new_arr + i); *(new_arr + i) = *(new_arr + i + 1); *(new_arr + i + 1) = tmp; } } len--; } return new_arr; }
|
nel main chiamo:
Codice sorgente - presumibilmente C++ |
#include"Algo.h" #include<iostream> using namespace std; void main() { int vett[] = {3,2,1,7,5}; int *j; int i = 0; Sort<int> *ordina = new Sort<int>(vett,5); j = ordina->BubbleSort(); while(i < 5) { cout<<*(j+i); i++; } cout<<endl; }
|
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?
|
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/2009
|
Non devi dividere nei file .cpp e .h il sorgente se usi classi template.
Deve stare tutto nel .h
|
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
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..... |
|
lorenzo (Normal User)
Guru
Messaggi: 1178
Iscritto: 15/04/2008
|
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 |
|
theprogrammer (Normal User)
Guru^2
Messaggi: 2509
Iscritto: 28/01/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++ |
template<class TYPE, class ARG_TYPE>
CArray<TYPE, ARG_TYPE>::CArray()
{
m_pData = NULL;
m_nSize = m_nMaxSize = m_nGrowBy = 0;
}
|
e tutto il resto.
|
|
gigisoft (Member)
Guru
Messaggi: 696
Iscritto: 11/10/2008
|
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... |
|