unresolved external symbol

Le problème exposé dans ce sujet a été résolu.

Bonjour (encore)

C'est pas la première fois que j'ai cette erreur et du coup cette fois ci j'aimerais bien comprendre. En faisant des recherches j'ai trouvé ce post qui explique vraiment bien les choses mais ça ne s'applique pas du tout à mon cas.

J'ai une classe (Player), dans le .hpp de cette classe je fais ceci (après la classe) extern Player me; (je sais c'est mal mais j'ai pas le choix.)

Si je compile pas de problème par contre si je fais cout << me.Health() << endl; la j'ai l'erreur (cf titre).

PS: petit detail, si au lieu d'utiliser extern je crée un objet simplement j'ai cette erreur : syntax error : missing ';' before identifier 'me'.

(la ligne en question est la déclaration de l'objet, donc simplement Player me; )

Bref je suis totalement perdu, j'ai l'impression de plus reculé qu'avancer en ce moment.

J'ai une classe (Player), dans le .hpp de cette classe je fais ceci (après la classe) extern LocalEntity me; (je sais c'est mal mais j'ai pas le choix.)

Mais encore ? Pourquoi n'as-tu pas le choix ?

Si je compile pas de problème par contre si je fais cout << me.Health() << endl; la j'ai l'erreur (cf titre).

Eh bien oui c'est normal si tu n'as jamais défini ta variable me. Avec ton extern tu dis juste "cette variable est définie quelque part, je veux juste la déclarer ici pour que ça compile dans ce fichier sans avoir la vraie définition".

PS: petit detail, si au lieu d'utiliser extern je crée un objet simplement j'ai cette erreur : syntax error : missing ';' before identifier 'me'.

On dirait qu'il te manque un #include du type LocalEntity, tout simplement.

Mais encore ? Pourquoi n'as-tu pas le choix ?

Voir plus bas, simplement car j'ai une autre erreur que je comprend encore moins :D.

Eh bien oui c'est normal si tu n'as jamais défini ta variable me. Avec ton extern tu dis juste "cette variable est définie quelque part, je veux juste la déclarer ici pour que ça compile dans ce fichier sans avoir la vraie définition".

Si je comprend bien. Pour faire plus simple, si je fais : extern int x; et que je fais 10 + x j'aurais la même erreur ?

Après test effectivement ça fonctionne, je croyais que extern permettait de définir la variable ainsi que sa porté.

Du coup pour ma seconde erreur (si je crée l'objet) j'ai ceci: syntax error : missing ';' before identifier 'me' sur la ligne Player me;. Si je dis pas de bêtise une erreur de syntaxe devrait être détecté par IntelliSense et la ce n'est pas le cas.

J'imagine que c'est probable que l'erreur soit dans un autre fichier que celui indiqué par Visual ?

Merci pour l'explication en tout cas Stranger

Non mais le problème de fond c'est que extern est un hack. Tu utilises ça quand tu as par exemple une variable globale dans A.cpp que tu veux utiliser dans B.cpp : tu la définis dans A, tu la redéfinis en extern dans B. C'est très spécifique comme instruction et ça ne doit pas être utilisé en conditions normales.

Ton vrai problème est tout bêtement que LocalEntity n'est pas défini. Tu as probablement juste oublié d'inclure le .h qui le définit et tu n'as pas besoin d'extern.

D'accord je comprend mieux le extern maintenant. Je pensais que c'était plus comparable a une variable SESSION en php.

Donc je pars sur un objet simple LocalEntity me; mais la j'ai ma fameuse erreur de syntaxe.

Cconcernant l'include il y est bien et comme je l'ai dis IntelliSense m'affiche aucune erreur, il colore bien LocalEntity comme un type et m'affiche bien toutes les méthodes/attributs quand j'essaye d’accéder à l'objet.

Intellisense est juste un moyen rapide de vérifier une erreur évidente, pas une vérification par la compilation. Il ne faut pas lui faire confiance outre mesure, c'est toujours le compilateur qui a raison.

Vérifie que l'include de ta classe LocalEntity, ou PLayer suivant tes posts, a bien été fait en haut du fichier. Si tu as un Github je pourrais regarder 10s.

Alors le code est pas sur github, concernant LocalEntity et Player ce sont les mêmes classes, le même projet mais organisé de deux façons pour voir ce qui va le mieux.

Et oui il y est bien, voici la class dans laquel est instancié mon objet :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#pragma once

#include <iostream>
#include "LocalEntity.h"

using std::cout;
using std::endl;

class Engine
{
public:
    LocalEntity me;

    void start();
    void update();
};

Le problème est donc très simple : tu as une dépendance circulaire entre tes deux classes et ça ne peut pas marcher. En C++, tu ne peux pas avoir deux classes comme ça qui s'incluent mutuellement. Revois ton design pour t'assurer que LocalEntity ne dépend pas de Engine (pas de #include).

Si par hasard ce n'est pas possible, tu n'auras pas d'autre choix que d'utiliser la forward declaration. Voir ici.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte