classe abstraite generique + heritage - C++ - Programmation
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;
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 ...
Marsh Posté le 02-04-2005 à 22:59:20
xasyl a écrit : oui oui pour le destructeur ct histoire de la foutre abstraite |
et non matrice est une classe template, il faut écrire qq chose qui respecte la syntaxe des def de templates cad:
|
Marsh Posté le 02-04-2005 à 23:18:50
Code :
|
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.
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 ??
Marsh Posté le 02-04-2005 à 23:31:14
Citation : désolé de paraitre ignorant c'est quoi blitz++ et boost::ublas ?? |
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
Marsh Posté le 02-04-2005 à 23:31:51
template <class Type>
class MatricePleine<Type> : public Matrice<Type>{};
argg cela ne compile tjs pas
Marsh Posté le 02-04-2005 à 23:33:57
ReplyMarsh 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...
Marsh Posté le 02-04-2005 à 23:41:47
La syntaxe n'est toujours pas correcte
Code :
|
ou
Code :
|
et non pas
Code :
|
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... ?
Marsh Posté le 02-04-2005 à 23:53:56
désolé faut que j'y aille d'urgence la, ça va bientot fermer ...
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
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{}
};
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
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
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 .....
Marsh Posté le 26-04-2005 à 10:43:25
Matrice, c'est une classe template.
Matrice<T> semble être une bonne candidate.
Marsh Posté le 26-04-2005 à 10:45:40
Citation : template <class T> |
la, c'est clair que la base publique est : Matrice<T>
Marsh Posté le 26-04-2005 à 17:22:47
pfff je suis vraiment ... effectivement si j'oublie <T>
Merci ++fab
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