CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

(c++) Heritage d'une classe template

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:00:12

Je voudrai faire deriver une classe d´un template.
Quand je le fait avec un template de la STL ( list<class T> par exemple), sa marche, mais quand j´utilise une classe a moi ( CArbre<class T> par exemple) : sa plante au linkage :

e00_reader error LNK2001: symbole externe non résolu " public: virtual __thiscall CArbre<class CTronconRoute *>::~CArbre<class CTronconRoute *>(void)" ( ??1?$CArbre@PAVCTronconRoute@@@@UAE@XZ)

e00_reader error LNK2019: symbole externe non résolu " public: __thiscall CArbre<class CTronconRoute *>::CArbre<class CTronconRoute *>(void)" ( ??0?$CArbre@PAVCTronconRoute@@@@QAE@XZ) référencé dans la fonction " public: __thiscall CArbreRoutes::CArbreRoutes(void)" ( ??0CArbreRoutes@@QAE@XZ)

( sous Visual Studio . net)

Bien entendu, j´ai fait un constructeur et un destructeur pour la classe mere et la classe fille. J´ai l´impression que pour faire heriter des templates, il faut les ecrire un peu specialement.

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 16:06:26

Comment as tu essayé de faire hériter ?

je te dis ça a l´aveuglette, car je ne fais pas hériter de la STL tous les jours ( lol), essaie :

template < class T>
class CArbre : public list
{
. ...
}

ou alors :

template < class T>
class CArbre : public list<T>
{
. ...
}

par contre, ATTENTION, il faut TOUT faire dans le . h, éviter de mettre des template dans un . cpp
( pour preuve, les STL sont implémentées dans leur . h)

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:10:39

Pour la STL, sa marche.
le probleme vien de mes classes. Mais j´ai fait mes classes en . h et . cpp
Sa vien peut-etre de là.

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 16:14:50

vu les erreurs, tu as implémenté dans un Cpp, essaie de tout mettre dans le . h

explication :
le template est traité en prétraitement, avant la compilation : il voit dans le main qu´il va avoir besoin d´une list<int> et d´une liste<float>
que fait il ?
il cree 2 classes distinctes, en remplaçant un coup les T par des int, un coup par des float.
puis il compile : et quand il compile, il crée le . obj qui reste figé.
au moment du linkage, il cherche ce dont il a besoin. Si tu as dans un fichier exterieur un list<char>, alors il ne le trouvera pas, car il aura déja compilé la partie < list>
c´est pour cela qu´il faut tout mettre dans le . h, pour qu´au moment du linkage, il aie encore acces au code générique, et puisse creer la classe list<char>

je crois que je me suis exprimé comme un porc, mais ce qu´il faut retenir, c´est :

" si tu as un template, tu implémentes direct dans le . h"

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 16:15:27

vi, ça doit venir de la :) pas de CPP :)
essaie ! !

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:17:36

Ok, merci :D
J´essai et je te di si ça marche :)

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:24:00

Ok, sa marche :ok:
Merchi bocouch :)
Donc toujours les templates dans les . h ou il existe des exeptions où il vaux mieux faire . h et . cpp ?

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 16:27:19

la regle, c´est :

sitot que tu mets un template devant une fonction, tu l´implémente dans le . h :)
y compris devant toute implémentation de méthode de classe :

template < class T>
void plouf::methode(T a)
{

}

--> y´a un template, donc dans le . h !

regarde les fichiers sources STL, c´est tout dans le . h :)

voila, je crois que c´est la seule regle :)

tu fais un arbre générique ? a nombre de fils par branche variable ou non ? intéressant ça :)

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:34:32

oué je fait un arbre generique. :)
J´avais commencé à tout mettre en template la class qu´il stoque et sa taille et mettre des fonction virtueles pure un peu de partout. Le big truc quoi :)
Mais mon tuteur m´a demandé de pas trop me prendre la tete. Donc j´ai reduit à 4 branches ( quadtree) pour l´utiliser uniquement pour les besoin de mon stage.
Je me prend deja pas mal la tete pour un truc assez simple ( quoique je sais pas si template de quadtree soit quelque chose qu´on peut apelé " simple"), je vais attendre un peu avant de m´amuser a faire des arbres a nombre de fils variables.

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 16:40:39

le plus chiant, c´est l´insertion et la supression ! quoi que pour un quadtree tu n´en as pas tellement besoin : ton arbre reste statique une fois construit.

mais dans ce cas la, pkoi veux tu y faire hériter de list ?

moi j´aurais vu ça comme ça :

template < class T>
class Arbre
{
private :
Arbre<T>* fils[4];
T element;
public:
Arbre(T elem); / / fait une feuille.
Arbre(Arbre<T>*,Arbre<T>*,Arbre<T>*,Arbre<T>*);
/ / fait un noeud.
~Arbre();
/ / méthodes diverses
. ..
};

Comment veux tu le structurer ?

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:48:27

Les classes meres :

template < class T>
class CCase : public T{
CCase *tab[4];
}

template < class T>
class CArbre{
CCase<T> *m_premier;
}

exemple de classe fille que j´ai fait :
class CCaseRoute : public CCase<list<CTronconRoute*> >
class CArbreRoutes : public CArbre<list<CTronconRoute*> >

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:50:26

[quote]le plus chiant, c´est l´insertion et la supression ! [\quote]
Je pense que parcourir l´arbre en long en large et en travers risque d´etre aussi trivial

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 16:53:45

d´accord :)
moi j´aurais fait avec une seule classe, mais bon, ça peut etre bien aussi ce que tu as fait :)

attention cependant, ta CCase contient des pointeurs vers les suivantes, mais jamais d´element T, C normal ?

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 16:59:02

class CCase : public T{
CCase *tab[4];
}

CCase herite de T, donc pas besoin de concerver un element T de ce type vu que que c´est un T :)

L´autre classe, c´est just parsque j´aurai une fonction lirefichier pour remplir l´arbres, + d´autres fonctions et données propre à l´arbre.

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 17:02:27

d´accord ! ! j´avais pas vu que c´était l´héritage meme que tu faisais en template ! !

C´est assez étrange ! Enfin bref, si ça marche !

lag-it
lag-it
Niveau 10
06 mai 2004 à 17:03:27

Tien puisqu´on parle de . h : j´ai un petit problème. J´ai créer 2 fichiers . h et deux . cpp pour 2 class Vector et Vertex.
J´ai mis un constructeur de conversion pour convertir un Vector en Vertex dans la class Vertex et inversement dans l´autre classe.
Cependant, le compilateur refuse de compiler : il me sort " Vertex(" innatendu et " Vector(" innatendu. QUe faire ? Les déclarations préliminaires " class Vector;" et l´autre ne font rien...

lag-it
lag-it
Niveau 10
06 mai 2004 à 17:04:10

Ah si j´ai résolu. Désolé :)

Ruffi
Ruffi
Niveau 9
06 mai 2004 à 17:06:25

C´est assez étrange !

J´aime bien programmer des trucs etranges :)

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 17:12:52

oula !
2 classes qui s´appellent mutuellement, c´est pas commun :-/ surtout dans 2 fichiers . h

essaie de mettre dans vertex.h :

  1. include " Vector.h"

class Vertex
{
blabla
convert(const Vector&)
};

et dans l´autre :

extern class Vertex;

class Vector
{
blabla
convert(const Vertex&);
};

le probleme, c´est que je ne suis pas sur qu´il compile correctement Vector. Ou alors essaie de mettre l´implémentation de la classe Vector dans le . h

JeanYvesYves
JeanYvesYves
Niveau 10
06 mai 2004 à 17:14:21

lag-it > comment y as tu résolu ? curiosité du JY² !

Ruffi > ok :) si ça marche apres tout ! :)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment