neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008
-
31 août 2005 à 22:52
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008
-
2 sept. 2005 à 19:21
Bonsoir, c'est encore moi et mes problèmes de c++ !
Je vais essayer de faire cour:
J'ai une classe template dans un fichier .hpp (déclaration & code). Ce template contient une méthode virtuelle.
virtual void loadRessource(char* key);
J'ai ensuite une classe CTextureManager dont les déclarations sont dans un .h et le code dans un .cpp.
Cette classe hérite de mon template et implémente donc ma méthode virtuelle. Le problème intervient lors de la compilation:
ctexturemanager.obj : error LNK2001: unresolved external symbol "public: virtual void __thiscall CRessourcesManager<class CTexture *>::loadRessource(char *)" ([mailto:?loadRessource@?$CRessourcesManager@PAVCTexture@@@@UAEXPAD@Z ?loadRessource@?$CRessourcesManager@PAVCTexture@@@@UAEXPAD@Z])
Je ne voit pas comment corriger le problème (héhé sinon je serai pas là !). J'ai peur que ce soit du au template, car j'avai déjà posé une question sur les template et l'on m'avait répondu qu'il n'était pas possible de séparer le code et les déclarations du template dans deux fichiers séparés (un .h et un .cpp). Ce problème est-il du même genre ? Ce que je cherche à faire est-il réalisable ?
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 1 sept. 2005 à 17:27
Pour les templates tu peux séparer l'interface de l'implémentation,
mais le fichier d'implémentation doit etre inclus dans chaque unité de
traduction pour l'instenciation implicite.
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 1 sept. 2005 à 23:26
virtuelle pure, ca veut dire qu'elle n'est pas implémentée dans la classe, qui devient alors abstraite (seulement parce qu'elle à une méthode virtuelle pure). La syntaxe est assez bizarre:
class A
{
virtual int f() = 0; est une méthode virtuelle pure, tu ne définis donc pas A::f
virtual int g(); est une méthode virtuelle, tu dois définir A::g, et aussi B::g si une sous classe B redéfinit cette méthode
};
Il est impossible d'instancier la classe A, ainsi que toute classe fille qui ne définit pas f. En gros tu pourrais faire le lien entre les classes abstraites du C++ et les interfaces de Java, même si ce n'est pas tout a fait pareil.
Virtuelle (pas pure) ca veut dire que la méthode peut être redéfinie par une sous-classe (c'est implicite en Java, toutes les méthodes sont virtuelles).
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 2 sept. 2005 à 10:57
steve_clamage> OK, si on considère qu'un B est un A, mais il reste de type B
neodelphi> L'utilité d'une méthode virtuelle. Je prends un exemple ou il faudrait une méthode virtuelle:
class A
{
public:
void f() {...}
};
class B: public A
{
void f() {...}
};
int main()
{
A* objet = new B();
objet->f(); // va appeler A::f alors qu'on voudrait peut être que ce soit B::f qui soit appelée, c'est ce qui serait fait si f était virtuelle
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008 1 sept. 2005 à 19:41
"as tu surchargé la méthode dans la classe héritée ?"
"Dans la classe mère surtout. Dans la classe fille tu n'est pas obligé d'implémenter une méthode virtuelle de la classe mère."
Qui parle de surcharge ? si j'ai bien comprit si je met une méthode virtuelle je n'ai pas besoin d'en écrire le code dans la classe mère. Mais je doit le faire dans la classe fille nan ?
steve_clamage
Messages postés475Date d'inscriptiondimanche 3 octobre 2004StatutMembreDernière intervention11 août 20065 1 sept. 2005 à 19:48
En effet la surcharge n'a rien à voir la dedans, on parle de redéfinition de méthode virtuelle.
"si j'ai bien comprit si je met une méthode virtuelle je n'ai pas besoin
d'en écrire le code dans la classe mère. Mais je doit le faire dans la
classe fille nan ?"
Ca c'est si ta méthode est virtuelle pure, sinon tu es obligé de fournir un corps.
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008 1 sept. 2005 à 23:11
A vrai dire plus vous me parler de ça plus je suis perdu.
J'ai fait du java, et pour moi une méthode virtuelle est une méthode qui n'est pas écrite, mais qui peut etre appelée. Seulement la classe n'est pas utilisable a moins d'etre hérité et que la classe qui hérite implémente cette méthode.
virtuel pure, c'est koi ?
neodelphi
Messages postés442Date d'inscriptionjeudi 4 avril 2002StatutMembreDernière intervention11 août 2008 2 sept. 2005 à 07:17
Merci pour toutes vos réponses, j'ai enfin pigé... en fait moi j'avait l'habitude des classes abstraites du java et des méthodes virtuelles du java, et en effet il y a quelques différences avec le c++.
Il me reste une question: quelle est l'utilité d'une fonction virtuelle non pure, parceque pour moi la c comme une méthode standart. Quelles sont les différences.
Sinon pour corriger mon erreur de compilo ça marche, j'ai mi en virtuelle pure.