Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2702 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  specialisation partielle d'une fonction d'un patron de classe

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

specialisation partielle d'une fonction d'un patron de classe

n°1642063
MVL2
Posté le 13-11-2007 à 11:46:59  profilanswer
 

Bonjour à tous,  
voila mon code  
 

Code :
  1. template <class T> class vector
  2. {
  3.       T * data;
  4.       int sz;
  5.       public:
  6.              vector(int n):sz(n) {data=new T[sz];}
  7.              ~vector() {delete[] data;}
  8.              T & operator[](int i){return data[i];}
  9.              vector<T> & operator= (const vector<T> & );
  10.              vector<T> (const vector<T> & );
  11.              void affiche() {cout<<data<<endl;}
  12.              T operator[](int i) const {return data[i];}
  13.              int size() const {return sz;}
  14. };     
  15. template <class T> vector<T> & vector<T>::operator =(const vector<T> & x)
  16. {
  17.                delete[] data;
  18.                sz=x.sz;
  19.                data=new T[sz];
  20.                for (int i=0; i<=sz-1; i++)
  21.                {
  22.                    data[i]=x.data[i];
  23.                } 
  24.                return *this;
  25. }
  26.              
  27. template <class T> vector<T>::vector<T>(const vector<T> & x)
  28. {
  29.        
  30.          sz=x.sz;
  31.          data=new T[sz];
  32.          for (int i=0; i=sz-1; i++)
  33.                {
  34.                    data[i]=x.data[i];
  35.                } 
  36. }
  37.  
  38. vector<T*> & vector<T*>::operator =(const vector<T*> & x)
  39. {
  40.                delete[] data;
  41.                sz=x.sz;
  42.                data=new (T*)[sz];
  43.                for (int i=0; i<=sz-1; i++)
  44.                {
  45.                    if (*(data[i])==0)
  46.                    {*(data[i])=*(x.data[i]);}
  47.                    else data[i]=x.data[i];
  48.                } 
  49.                return *this;
  50. }
  51. vector<T*>::vector<T*>(const vector<T*> & x)
  52. {
  53.        
  54.          sz=x.sz;
  55.          data=new (T*)[sz];
  56.          for (int i=0; i=sz-1; i++)
  57.                {
  58.                    if (*(data[i])==0)
  59.                    {*(data[i])=*(x.data[i]);}
  60.                    else data[i]=x.data[i];
  61.                } 
  62. }


 
Alors je vous explique, je crée une classe vector, munit d'un tableau dynamique, et je cherche a specialiser mon operateur d'affectation ( = ) et mon operateur de copie de la classe dans le cas ou le tableau est lui même un tableau de pointeur. En effet il faudra alors faire une deep copie, car si non au lieu de copier les valeurs pointés par les cases du tableau, je copierai les adresses, ce qui n'a aucun interet.
 
Le probleme est que, je sais proceder a une specialisation de fonction de classe, pas de probleme ou a une specialisation partielle de classe, pas de probleme, mais comment faire pour proceder a une specialisation partielle de fonction de classe, quelle est la syntaxe.
 
Je voudrait toujours garder le type T indéfini dans la nouvelle definition de l'operateur= et affectation mais les specialiser en type T* pour pouvoir dans ce cas la effectuer la deep copie.
 
Il s'agit donc de declarer de maniere adequate les deux dernieres fonctions que vous voyez.
 
 
Merci d'avance a qui pourra m'indiquer la syntaxe correcte.


Message édité par MVL2 le 13-11-2007 à 11:50:31
mood
Publicité
Posté le 13-11-2007 à 11:46:59  profilanswer
 

n°1642079
MVL2
Posté le 13-11-2007 à 12:13:21  profilanswer
 

J'ai trouvé une autre possibilité, j'ai carrément procedé a une specialisation partielle de la classe toute entiere puis redeclaré les fonctions concernées.
 

Code :
  1. template <class T> class vector
  2. {
  3.       T * data;
  4.       int sz;
  5.       public:
  6.              vector(int n):sz(n) {data=new T[sz];}
  7.              ~vector() {delete[] data;}
  8.              T & operator[](int i){return data[i];}
  9.              vector<T> & operator= (const vector<T> & );
  10.              vector<T> (const vector<T> & );
  11.              void affiche() {cout<<data<<endl;}
  12.              T operator[](int i) const {return data[i];}
  13.              int size() const {return sz;}
  14. };     
  15. template <class T> class vector<T*>
  16. {
  17.       T * * data;
  18.       int sz;
  19.       public:
  20.              vector(int n):sz(n) {data=new T*[sz];}
  21.              ~vector() {delete[] data;}
  22.              T* & operator[](int i){return data[i];}
  23.              vector<T*> & operator= (const vector<T*> & );
  24.              vector<T*> (const vector<T*> & );
  25.              void affiche() {cout<<data<<endl;}
  26.              T* operator[](int i) const {return data[i];}
  27.              int size() const {return sz;}
  28. };     
  29. template <class T> vector<T> & vector<T>::operator =(const vector<T> & x)
  30. {
  31.                delete[] data;
  32.                sz=x.sz;
  33.                data=new T[sz];
  34.                for (int i=0; i<=sz-1; i++)
  35.                {
  36.                    data[i]=x.data[i];
  37.                } 
  38.                return *this;
  39. }
  40.              
  41. template <class T> vector<T>::vector<T>(const vector<T> & x)
  42. {
  43.        
  44.          sz=x.sz;
  45.          data=new T[sz];
  46.          for (int i=0; i=sz-1; i++)
  47.                {
  48.                    data[i]=x.data[i];
  49.                } 
  50. }
  51.  
  52. template <class T>  vector<T*> & vector<T*>::operator =(const vector<T*> & x)
  53. {
  54.                delete[] data;
  55.                sz=x.sz;
  56.                data=new T*[sz];
  57.                for (int i=0; i<=sz-1; i++)
  58.                {
  59.                    if (*(data[i])==0)
  60.                    {*(data[i])=*(x.data[i]);}
  61.                    else data[i]=x.data[i];
  62.                } 
  63.                return *this;
  64. }
  65. template <class T> vector<T*>::vector<T*>(const vector<T*> & x)
  66. {
  67.        
  68.          sz=x.sz;
  69.          data=new T*[sz];
  70.          for (int i=0; i=sz-1; i++)
  71.                {
  72.                    if (*(data[i])==0)
  73.                    {*(data[i])=*(x.data[i]);}
  74.                    else data[i]=x.data[i];
  75.                } 
  76. }


 
Mais est-on obligé de proceder a une specialisation partielle de classe, ne peut pas pas proceder uniquement a une specialisation partielle des fonctions membres pour T*?
 
Merci


Message édité par MVL2 le 13-11-2007 à 12:14:03
n°1642086
Taz
bisounours-codeur
Posté le 13-11-2007 à 12:29:55  profilanswer
 

c'est ça. Il n'y a pas de spécialisation partielle de fonction template. Pour résoudre le problème sans tout dupliquer, utilise une classe mère dont hérite la version générique et la version spécialisée.

n°1642099
MVL2
Posté le 13-11-2007 à 12:51:12  profilanswer
 

Ok merci Taz pour l'info.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  specialisation partielle d'une fonction d'un patron de classe

 

Sujets relatifs
définir un polynome à l'aide de la fonction "atoi" avec des listesBBCode fonction [spoil]
[Flash/ActionScript] Classe externesmail, PJ et free: si qqun a reussi... [RESOLU]
Visibilité de méthodes dans une classe interneprobléme avec la fonction getDate()
l'inverse d'une fonction[C] Problème avec une fonction récursive
Aide pour comprendre une fonctionParamètre dans une fonction
Plus de sujets relatifs à : specialisation partielle d'une fonction d'un patron de classe


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR