classe abstraite generique + heritage

classe abstraite generique + heritage - C++ - Programmation

Marsh Posté le 02-04-2005 à 22:20:11    

Bonsoir,
comme dit dans le sujet j'ai une classe abstraite "template" Matrice :  
 
dans le fichier matrice.h
 
#ifndef ...
#define ...
 
template <class Type>
class Matrice{
 
//code
 
virtual ~Matrice()=0;  // comme cela elle est abstraite
};
 
//apres je veux dériver ma classe Matrice en MatricePleine
 
class MatricePleine : public Matrice{
//je redéfini le destructeur
};
 
#endif
std::ostream & operator<<(std::ostream &,const Matrice<Type>& );
 
Et comme on peut s'en douter cela ne compile pas : il ya une érreur de syntaxe au niveau de la dérivation class MatricePleine...
 
Merci d'avance
 

Reply

Marsh Posté le 02-04-2005 à 22:20:11   

Reply

Marsh Posté le 02-04-2005 à 22:24:28    

BEIN OUI
MATRICE EST UNE CLASSE TEMPLATE? ET NE PEUT DONC PAS ÊTRE DERIV2E PAR UNE CLASSE SIMPLE; IL FAUT QUE TU ECRIVE MATRICE PLEINE COMME UNE CLASSE TEMPLATE AUSSI; SECONDO LE DESTRUCTEUR VIRTUEL PUR EST ICI UNE IDIOTIE;


Message édité par schnapsmann le 02-04-2005 à 22:25:04

---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 02-04-2005 à 22:29:00    

:D

Reply

Marsh Posté le 02-04-2005 à 22:51:49    

oui oui pour le destructeur ct histoire de la foutre abstraite  
ben oui théroquement car qd je fais
template <class Type> class MatricePleine : public Matrice{};
cela ne fonctionne pas non plus ...

Reply

Marsh Posté le 02-04-2005 à 22:59:20    

xasyl a écrit :

oui oui pour le destructeur ct histoire de la foutre abstraite  
ben oui théroquement car qd je fais
template <class Type> class MatricePleine : public Matrice{};
cela ne fonctionne pas non plus ...


et non matrice est une classe template, il faut écrire qq chose qui respecte la syntaxe des def de templates cad:


template <typename TYPE>
class MatricePleine<TYPE> : public Matrice<TYPE>
{
...
};



---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 02-04-2005 à 23:18:50    


Code :
  1. template <class T>
  2. struct matrice_pleine : matrice<T> // the CRTP
  3. {
  4. //...
  5. };


 
Si ton objectif n'est pas de réinventer la roue, tu peux t'orienter vers blitz++, ou boost::ublas, qui utilisent cette technique, et vont meme beaucoup plus loin.

Reply

Marsh Posté le 02-04-2005 à 23:23:38    

désolé de paraitre ignorant c'est quoi blitz++ et boost::ublas  ??
je fais cela dans le cadre d'un TP
y a une difference entre les mots-clés class et typename ??

Reply

Marsh Posté le 02-04-2005 à 23:31:14    

Citation :

désolé de paraitre ignorant c'est quoi blitz++ et boost::ublas  ??
je fais cela dans le cadre d'un TP


des librairies de calcul scientifique (calcul matriciel notamment).
 

Citation :

y a une difference entre les mots-clés class et typename ??


tel que cela apparait dans ce thread, non.
Si j'en dis plus, c'est le début d'une longue discussion ;)


Message édité par ++fab le 02-04-2005 à 23:33:09
Reply

Marsh Posté le 02-04-2005 à 23:31:51    

template <class Type>
class MatricePleine<Type> : public Matrice<Type>{};
 
argg cela ne compile tjs pas

Reply

Marsh Posté le 02-04-2005 à 23:33:57    

++fab a écrit :

Code :
  1. template <class T>
  2. struct matrice_pleine : matrice<T> // the CRTP
  3. {
  4. //...
  5. };




Reply

Marsh Posté le 02-04-2005 à 23:33:57   

Reply

Marsh Posté le 02-04-2005 à 23:36:45    

moi j'utilisais  
template <class Type>  
class Matrice{ };
template <class Type>  
class MatricePleine<Type> : public Matrice<Type>{};  
 
pourquoi "struct" et non pas "class" pour MatricePleine ?
excuse moi je ne maitrise pas du tout les templates...
 
 

Reply

Marsh Posté le 02-04-2005 à 23:41:47    

La syntaxe n'est toujours pas correcte :o
 

Code :
  1. template <class T>
  2. class matrice_pleine : public matrice<T>
  3. {};


 
ou  
 

Code :
  1. template <class T>
  2. struct matrice_pleine : matrice<T> //public par défaut
  3. {};


 
et non pas
 

Code :
  1. template <class T>
  2. class matrice_pleine<T> : public matrice<T>
  3. {};


Message édité par ++fab le 02-04-2005 à 23:42:16
Reply

Marsh Posté le 02-04-2005 à 23:50:09    

oui mais j'ai commencé avec le type <Type> dans ma classe Matrice et puis pour la classe MatricePleine tu me dis d'utiliser le type <T> quand je dois réécrire les fonctions dérivées (les virtuelles pures) je devrais utiliser le type <T> alors... ?

Reply

Marsh Posté le 02-04-2005 à 23:53:56    

désolé faut que j'y aille d'urgence la, ça va bientot fermer ...  [:macatack]

Reply

Marsh Posté le 02-04-2005 à 23:56:18    

merci qd meme fab

Reply

Marsh Posté le 03-04-2005 à 13:29:53    

désolé de persister l'héritage ne fonctionne pas :  
dans le fichier matrice.h
 
template <class T>
class Matrice{
 
 
//attributs
protected :
 
 int ligne;
 int colonne;
 T *matrice;
//code
};
 
template <class T>
class MatricePleine : public Matrice<T>{};
 
je veux utiliser les attributs ligne,colonne,matrice dans MatricePleine et à la compilation erreur : ligne colonne ... n'existent pas  
:??:

Reply

Marsh Posté le 03-04-2005 à 14:01:36    

et this-> :o

Reply

Marsh Posté le 03-04-2005 à 17:58:43    

cela ne change rien il y a tjs des erreurs de compilation
Je me demande si le compilo effectue bien l'héritage :  
template <class T>  
class Matrice{  
 
 
//attributs  
protected :  
 
 int ligne;  
 int colonne;  
 T *matrice;  
//code  
};  
 
template <class T>  
class MatricePleine : public Matrice<T>{
          //les parametres ne sont pas bons je sais
          Matrice(i,j) : ligne(i),ligne(j),matrice=NULL{}
};

Reply

Marsh Posté le 03-04-2005 à 17:59:54    

ah oué non mais ca faut pas, c'est a Matrice d'initialiser ses  variables de cette maniere


---------------
NP: HTTP Error 764 Stupid coder found
Reply

Marsh Posté le 03-04-2005 à 18:19:01    

ok chrisbk j'ai effectivement codé n'importe comment...
 
Par contre sachant que ma classe Matrice est abstraite je veux instancier un objet MatricePleine
je fais MatricePleine<int> mp;
or j'ai à la compil l'erreur suivante :
initializer specified for non-virtual method `_mat::Matrice<int>::operator ()(unsigned int, unsigned int, int)'
sachant que j'ai rédéfini l'opérateur() (car il est virtuel dans la classe Matrice):  
void operator()(posint i,posint j,T val) où posint est  
#define posint unsigned int  
 

Reply

Marsh Posté le 26-04-2005 à 10:37:05    

De retour, désolé un ptit souci
J'ai une classe Matrice (template et abstraite) qui a un constructeur ainsi  
Matrice(posint l=0,posint c=0,const T& val=0) :ligne(l),colonne(c){matrice.resize(ligne*colonne,val);
 
J'ai une classe qui dérive de Matrice, MatricePleine et je veux faire appel au constructeur de Matrice -->
MatricePleine(posint l,posint c,const T& val=0) : Matrice(l,c,val) {}
 
Et ...121 E:\Dev\Dev-Cpp\matrice2.h class `_mat::MatricePleine<T>' does not  have any field named `Matrice'  
Il pige pas que je veux faire appel au constructeur .....    

Reply

Marsh Posté le 26-04-2005 à 10:43:25    

Matrice, c'est une classe template.
Matrice<T> semble être une bonne candidate.

Reply

Marsh Posté le 26-04-2005 à 10:45:40    

Citation :

template <class T>  
class MatricePleine : public Matrice<T>{
          //les parametres ne sont pas bons je sais
          Matrice(i,j) : ligne(i),ligne(j),matrice=NULL{}
};


 
la, c'est clair que la base publique est : Matrice<T>

Reply

Marsh Posté le 26-04-2005 à 17:22:47    

pfff je suis vraiment ... effectivement si j'oublie <T>
Merci ++fab

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed