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

  FORUM HardWare.fr
  Programmation
  C++

  classe abstraite generique + heritage

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

classe abstraite generique + heritage

n°1033324
xasyl
Posté le 02-04-2005 à 22:20:11  profilanswer
 

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
 

mood
Publicité
Posté le 02-04-2005 à 22:20:11  profilanswer
 

n°1033328
schnapsman​n
Zaford Beeblefect
Posté le 02-04-2005 à 22:24:28  profilanswer
 

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!"
n°1033331
Taz
bisounours-codeur
Posté le 02-04-2005 à 22:29:00  profilanswer
 

:D

n°1033352
xasyl
Posté le 02-04-2005 à 22:51:49  profilanswer
 

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

n°1033354
schnapsman​n
Zaford Beeblefect
Posté le 02-04-2005 à 22:59:20  profilanswer
 

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!"
n°1033355
++fab
victime du syndrome IH
Posté le 02-04-2005 à 23:18:50  profilanswer
 


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.

n°1033356
xasyl
Posté le 02-04-2005 à 23:23:38  profilanswer
 

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

n°1033358
++fab
victime du syndrome IH
Posté le 02-04-2005 à 23:31:14  profilanswer
 

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
n°1033359
xasyl
Posté le 02-04-2005 à 23:31:51  profilanswer
 

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

n°1033360
++fab
victime du syndrome IH
Posté le 02-04-2005 à 23:33:57  profilanswer
 

++fab a écrit :

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




mood
Publicité
Posté le 02-04-2005 à 23:33:57  profilanswer
 

n°1033362
xasyl
Posté le 02-04-2005 à 23:36:45  profilanswer
 

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

n°1033363
++fab
victime du syndrome IH
Posté le 02-04-2005 à 23:41:47  profilanswer
 

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
n°1033365
xasyl
Posté le 02-04-2005 à 23:50:09  profilanswer
 

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

n°1033366
++fab
victime du syndrome IH
Posté le 02-04-2005 à 23:53:56  profilanswer
 

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

n°1033368
xasyl
Posté le 02-04-2005 à 23:56:18  profilanswer
 

merci qd meme fab

n°1033541
xasyl
Posté le 03-04-2005 à 13:29:53  profilanswer
 

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

n°1033552
Taz
bisounours-codeur
Posté le 03-04-2005 à 14:01:36  profilanswer
 

et this-> :o

n°1033714
xasyl
Posté le 03-04-2005 à 17:58:43  profilanswer
 

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{}
};

n°1033716
chrisbk
-
Posté le 03-04-2005 à 17:59:54  profilanswer
 

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
n°1033744
xasyl
Posté le 03-04-2005 à 18:19:01  profilanswer
 

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  
 

n°1060921
xasyl
Posté le 26-04-2005 à 10:37:05  profilanswer
 

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

n°1060928
++fab
victime du syndrome IH
Posté le 26-04-2005 à 10:43:25  profilanswer
 

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

n°1060931
++fab
victime du syndrome IH
Posté le 26-04-2005 à 10:45:40  profilanswer
 

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>

n°1061614
xasyl
Posté le 26-04-2005 à 17:22:47  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  classe abstraite generique + heritage

 

Sujets relatifs
[vb.net]voir une variable dans une classe classeFonction générique
Classe abstraite et operator<<[java] Classe abstraite, polymorphisme et tableau
Heritage et J2ME[JSP] Accéder à une classe
[Java] classe de gestion de fichier .ini à disposition par ici[c++] classe et typedef
Plus de sujets relatifs à : classe abstraite generique + heritage


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