2011-10-25 3 views
1

Je vais avoir un fichier d'en-tête appelé cnVector.h dont l'implémentation est écrite en cnVector.cpp. Ces deux fichiers se trouvent dans le même répertoire.Problèmes de liaison des fichiers .cpp dans Code :: Blocks

cNormalCBP/ 
    + src/ 
     + cNormal/ 
      + cnUtils/ 
       - cnVector.h 
       - cnVector.cpp 
     - main.cpp 

L'en-tête contient une définition de classe simple.

class cnVector { 
    public: 
     cnVector(double, double, double); 

     inline cnVector cross(const cnVector&) const; 
}; 

La mise en œuvre dans le fichier .cpp est la suivante:

#include "cnVector.h" 
/* constructor */ cnVector::cnVector(double x, double y, double z) 
     : x(x), y(y), z(z) { 
} 

cnVector cnVector::cross (const cnVector& vOther) const { 
    return cnVector(
     y * vOther.z + z * vOther.y, 
     z * vOther.x + x * vOther.z, 
     x * vOther.y + y * vOther.x); 
} 

Maintenant, le code suivant de main.cpp pauses à la ligne en raison d'une référence non définie à cnVector :: cross (cnVector const &) const;
Notez comment l'implémentation du constructeur est reconnue, mais pas la méthode cnVector::cross.

int main() { 
    cnVector v1(1, 0, 0), v2(0, 1, 0); 
    cnVector v3 = v1.cross(v2); 
} 

Je reçois aussi un avertissement message d'erreur : fonction inline 'cnVector cnVector :: croix (const cnVector &) const' utilisé mais jamais défini.
La copie de l'implémentation dans main.cpp fonctionne.

Pouvez-vous me expliquer pourquoi je peux construire une cnVector instance, mais la mise en œuvre d'autres méthodes ne sont pas reconnus?

+0

"code de main.cpp casse à la ligne 3" - par cela vous voulez dire que vous obtenez une erreur de lien? Etes-vous sûr que cnVector.cpp est répertorié dans "Build target files" sous "Build target tab" dans "Project-> Properties"? Enfin pouvez-vous poster main.cpp complet? Voulez-vous voir #includes – Kashyap

+0

Niklas, pouvez-vous nous dire quel compilateur/os vous utilisez? Et y a-t-il un code qui a été omis ici? Comme je l'ai noté sur la réponse ci-dessous, j'ai coupé et collé votre code et cela fonctionne bien pour moi dans VS 2010 sur Win7. – JoeFish

+0

@Joe Bien sûr, désolé. * Win7 CyGWin GCC *. Oui, il y a un code omis, dans le fichier d'en-tête d'autres déclarations de méthodes et leur implémentation dans le fichier * .cpp * ainsi que les inclusions inutiles. Dans le * main.cpp * j'ai manqué le '#include cNormal/cNormal.h" '. * CNormal.h * inclut essentiellement * cnUtils.h * qui inclut * cnVector.h *. –

Répondre

2

Déplacez vos fonctions intégrées vers votre fichier d'en-tête. Les fonctions en ligne ont besoin de leurs définitions entières dans les fichiers d'en-tête en raison de leur intégration avec le reste de votre code. Le compilateur tentera (peut-être) d'insérer le code à tous les emplacements où la fonction est appelée, il doit donc être visible dans le fichier d'en-tête de la même manière que les modèles doivent être entièrement présents dans le fichier d'en-tête.

+0

Le mot-clé inline devrait permettre la définition de la fonction inline dans le fichier .cpp.Et en fait, lorsque je coupe et collez le code dans la question dans Visual Studio 2010, il compile et s'exécute très bien. – JoeFish

+0

J'utilise Code :: Blocks et mingw moi-même. Je me suis débarrassé de tous les problèmes en plaçant les définitions entières dans le fichier d'en-tête. Personnellement, je ne recommande pas de placer l'implémentation dans le fichier '.cpp'. Si c'est une fonction courte, cela n'encombrera pas les choses dans l'en-tête. Si c'est une longue fonction, peut-être que ça ne devrait pas être en ligne. : D – TheBuzzSaw

+0

Je ne peux pas dire que je ne suis pas d'accord, et cela devrait certainement faire disparaître le problème. Mais je suis très curieux de savoir pourquoi il/elle a le problème en premier lieu, puisque le code semble valide. – JoeFish

Questions connexes