2010-06-26 5 views
0

Considérez ce codeConstructeurs en-ligne? Expliquer ce comportement [C++]

#include <iostream> 
#include <cstdio> 
using namespace std; 

class Dummy { 
public: 
    Dummy(); 
}; 

inline Dummy::Dummy() { 
    printf("Wow! :Dummy rocks\n"); 
} 

int main() { 
    Dummy d; 
} 

Tout est bien ici!

Maintenant, je fais cette modification. Je déplace la déclaration de Dummy à "dummy.h".

class Dummy { 
public: 
    Dummy(); 
}; 

Et définir le constructeur Dummy() comme suit dans "dummy.cpp"

#include "dummy.h" 
inline Dummy::Dummy() { 
    printf("Wow! :Dummy rocks\n"); 
} 

Et enfin, j'ai mon dossier principal comme:

#include <iostream> 
#include <cstdio> 
#include "dummy.h" 
using namespace std; 

int main() { 
    Dummy d; 
} 

Il compile bien, mais je reçois une erreur de l'éditeur de liens se plaignant d'une référence indéfinie à Dummy :: Dummy().

Toute idée.

-

Répondre

3

Vous devez mettre toutes les fonctions en ligne (y compris les méthodes et constructeurs/destructeurs) dans un fichier d'en-tête, où ils sont déclarés.

Bien que ce code devrait fonctionner de toute façon, avec main() appelant le constructeur comme si le mot-clé inline n'était pas là. Êtes-vous sûr de passer des fichiers objets des deux unités de compilation à l'éditeur de liens?

+0

yeah.it fonctionne avec le mot-clé inline retiré du constructeur, ce qui implique clairement que l'éditeur de liens obtient les deux fichiers objet, En ce qui concerne la définition des méthodes inline en en-tête, je vois votre point, mais je me demande notez le constructeur? – sud03r

+0

@Neeraj C'est un problème parce que ces autres fonctions n'étaient utilisées que dans le même fichier .cpp que les fonctions en-ligne. – 5ound

+0

@above correct .. – sud03r

0

Essayez de supprimer le spécificateur en ligne du fichier d'implémentation. Si ma compréhension est correcte, vous ne pouvez qu'informer dans un en-tête

+0

Votre compréhension est partiellement correcte. Pour qu'une fonction soit en ligne, sa définition doit être visible dans une unité de compilation avant d'être utilisée (c'est-à-dire dans un en-tête, avec la déclaration). Mais même si ce n'est pas le cas, la définition dans * une autre * unité de compilation produira une instance hors ligne d'une fonction, et la première unité de compilation appellera simplement cette instance comme si le mot clé 'inline' n'était pas là. – slacker

+0

Merci pour la clarification. – nathan

+0

@slacker: la définition d'une autre unité de compilation * peut produire une instance hors ligne. Il n'est pas précisé si c'est le cas ou non, et le code qui en dépend est mal formulé. –

2

Vous devriez penser comment la compilation fonctionne en C++ et l'idée de séparer les unités de compilation utilisées en C++ et l'encapsulation acquise en utilisant les en-têtes et les fichiers cpp.

Regardez ici: http://www.parashift.com/c++-faq-lite/inline-functions.html#faq-9.6

La ligne indique au complier qu'au lieu d'appeler la fonction « copier - coller » son code au lieu de l'appel de fonction. Lorsque vous placez la définition inline dans un fichier CPP, elle ne sera pas visible lors de la liaison à d'autres unités compilées (son fichier cpp n'est pas dans le fichier h), de sorte que le compilateur comprendra la signature de la classe donc il ne va pas implémenter celui par défaut. Mais l'éditeur de liens ne peut pas trouver le corps de la fonction car il est implanté en ligne dans le fichier cpp.

Questions connexes