2012-02-09 8 views
10

J'ai une classe qui déclare une méthode mais ne l'implémente pas. La méthode n'est pas une fonction virtuelle. Dans le fichier cpp correspondant, je n'ai pas trouvé la définition de la même méthode. Toutes les autres méthodes déclarées dans la classe ont été définies.Méthode déclarée en classe mais non définie

J'ai compilé le code et tout s'est bien passé. J'avais l'impression que cpp doit mandater la définition d'une méthode déclarée.

Appréciez si quelqu'un pourrait élaborer sur le même. J'utilise cl compilateur de VS2010.

Répondre

10

Votre code va compiler mais il va donner des erreurs de liaison.

Construire un exécutable de votre projet comporte deux étapes:

  • Compilation
  • Liens

Au cours Compilation le compilateur ne fait que traduire le code source en code objet en vérifiant la sémantique du langage .
Pendant Liaison l'éditeur de liens recherche les définitions des symboles et crée un exécutable à partir de plusieurs fichiers objets (créés lors de la compilation).

Le compilateur compile le code source dans chaque unité de traduction (fichiers .cpp + en-tête) séparément et suppose donc que la définition doit être présente dans un autre fichier source. C'est le Linker qui essaie de trouver des références aux définitions de fonctions, et donc la définition manquante sera signalée par l'éditeur de liens.

Notez que l'éditeur de liens doit relier uniquement les symboles qui sont utilisés par votre programme,
Ex: Si votre programme déclare une fonction, ne fournit aucune définition & alors jamais utilisations/appels la fonction partout, l'éditeur de liens n'a pas besoin d'incorporer le code pour sauter à l'adresse où le code objet de la fonction réside sur n'importe quel site d'appel de fonction.
Étant donné un tel scénario, l'éditeur de liens n'aura jamais besoin de rechercher la définition de la fonction. D'où le code compilera et liera.

+5

IMHO, L'erreur de liaison se produira seulement si la fonction avec missing-definition est utilisée/appelée explicitement/implicitement quelque part. – fizzbuzz

+0

@fizzbuzz: Oui, bien sûr. C'est le critère de base. –

+0

Je n'ai aucune compilation ou erreur de liaison. Juste pour ajouter je n'utilise pas la fonction nulle part. Le code compile et lie bien dans le fichier .lib. – akrohit

3

La méthode ne doit pas nécessairement être implémentée dans un fichier particulier. En effet, il est (ou a été) considéré comme une bonne pratique de programmation d'avoir un fichier par méthode pour réduire la météorisation lors de la liaison avec des bibliothèques. Cela signifie que, compte tenu d'un fichier d'en-tête qui définit une classe (et qui ne contient probablement pas l'implémentation), le compilateur ne peut que supposer que toutes les fonctions sont implémentées quelque part. C'est seulement au moment où le système tente de tout rassembler (l'étape du lien) qu'il devient apparent que vous faites référence à quelque chose qui n'est pas là.

+0

Un fichier ** par ** méthode? Semble excessif ... –

+0

pas vraiment. cela fait beaucoup moins de ballonnements et de problèmes de liens surprenants. Certains compilateurs modernes rendent cela inutile en faisant en sorte que chaque fonction vive dans une section d'objet distincte, mais la plupart ne le font pas. –

+0

J'ai vérifié et je n'ai pas trouvé la définition de la méthode dont je parle plus haut dans un autre fichier. – akrohit

3

C'est une technique courante pour empêcher l'affectation ou la copie. Si vous le déclarez mais ne le définissez pas, une erreur de liaison se produira si vous essayez de l'utiliser, ce qui empêche les utilisateurs de l'utiliser par inadvertance

0

Le compilateur ne se plaint pas car il n'y a pas d'erreur de syntaxe/compilateur. L'éditeur de liens ne se plaint pas car vous n'appelez pas la fonction dans votre programme, il n'a donc pas besoin d'être lié.

Questions connexes