Oppure

Loading
13/03/09 21:25
lorenzo
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?
aaa
13/03/09 21:40
theprogrammer
Il codice? L'errore?
aaa
14/03/09 7:48
lorenzo
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....
aaa
14/03/09 7:58
lorenzo
rettifico, credevo di aver risolto.

Allora il mio Algo.h è così:

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ì:

#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:

#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?
aaa
14/03/09 10:12
theprogrammer
Non devi dividere nei file .cpp e .h il sorgente se usi classi template.

Deve stare tutto nel .h
aaa
14/03/09 11:11
lorenzo
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.....
aaa
14/03/09 11:12
lorenzo
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 14/03/09 11:13
aaa
14/03/09 11:37
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).

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

afxtempl.h

ad esempio, per i CArray troverai

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