Unresolved external symbol

Résolu
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008 - 31 août 2005 à 22:52
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 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 ?

Merci encore pour votre aide

neodelphi

20 réponses

steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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.

On peut faire



template <...> class A

{...

};

#include "A.cpp"
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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).
3
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
1 sept. 2005 à 23:46
En fait une methode virtuelle pur peut etre implémentée, dans le cas d'un destructeur par exemple.



class A

{

public:

virtual ~A() = 0;

};



A::~A() // pour que le destructeur puisse etre appelé lors de la destruction d'un A

{

}
3
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
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
}
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_neria Messages postés 319 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 16 février 2009
1 sept. 2005 à 11:51
As tu surchargé la méthode dans la classe héritée ?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 sept. 2005 à 12:22
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.

Pourquoi pour ta classe fille tu veux séparer interface et implémentation?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 sept. 2005 à 17:39
Euh... tu conseille de faire ca?
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
1 sept. 2005 à 18:05
Je l'ai jamais fais, mais on peut faire comme ca. Avec une autre extension que .cpp ca serait mieux.
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 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 ?

neodelphi
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
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.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 sept. 2005 à 19:50
Non c'est le contraire, sauf si c'est une méthode virtuelle pure.
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
1 sept. 2005 à 20:06
Euh, ce que tu appelle fille c'est bien la classe qui hérite d'une autre classe nan ?

neodelphi
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
1 sept. 2005 à 20:17
Oui



Tu as compris l'histoire de "virtuelle pure" ?
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 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
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 sept. 2005 à 23:51
A quoi sert la =0 dans ce cas? A obliger les sous-classes à créer un destructeur?
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
1 sept. 2005 à 23:57
C'est pour rendre A abstraite.
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
2 sept. 2005 à 00:05
Si A est abraite, on n'instancie pas A, donc le destructeur ne sert a rien!?
0
steve_clamage Messages postés 475 Date d'inscription dimanche 3 octobre 2004 Statut Membre Dernière intervention 11 août 2006 5
2 sept. 2005 à 00:19
Et si B hérite de A et que B n'et pas abstraite alors tu instancies un A ! ~B() appel ~A()



Testes ce code avec et sans la définition de ~foo()



struct foo

{

virtual ~foo() = 0;

};



foo::~foo()

{

}



struct bar

: foo

{

~bar()

{

}

};



int main()

{

bar b;

}
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 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.

neodelphi
0
neodelphi Messages postés 442 Date d'inscription jeudi 4 avril 2002 Statut Membre Dernière intervention 11 août 2008
2 sept. 2005 à 19:21
Merci, très bon exemple, j'ai comprit. Il faut y penser lol !

neodelphi
0
Rejoignez-nous