2010-05-05 3 views
1

Dans un projet C++ basé sur un plug-in, j'ai un TmpClass qui est utilisé pour échanger des données entre l'application principale et les plugins. Par conséquent, le TmpClass.h respectif est inclus dans la classe d'interface plugin abstraite qui est incluse par le projet d'application principal et implémentée par chaque plugin. Comme les plugins fonctionnent sur les vecteurs STL de TmpClass instances, il doit y avoir un constructeur et un destructeur par défaut pour TmpClass. Je l'avais déclaré dans ces TmpClass.h:C++: Constructeur/destructeur non résolu lorsqu'il n'est pas en ligne?

class TmpClass { 
    TmpClass(); 
    ~TmpClass(); 
} 

et les mises en œuvre TmpClass.cpp.

TmpClass::~TmpClass() {} 
TmpClass::TmpClass() {} 

Cependant, lors de la compilation des plugins cela conduit à l'éditeur de liens se plaindre de deux externals non résolus - le constructeur par défaut et Destructeur de TmpClass comme l'exige la instanciation de modèle std::vector<TmpClass> - même si toutes les autres fonctions que je déclare dans TmpClass.h et mettre en œuvre TmpClass.cpp travail. Dès que je supprime le constructeur et le destructeur (vide) par défaut du fichier .cpp et les insère dans la déclaration de classe dans le fichier .h, les plugins se compilent et fonctionnent.

Pourquoi le constructeur par défaut et le destructeur ont-ils pour être compilés pour ce code? Pourquoi même? (J'utilise MSVC++ 8).

+2

Avez-vous inclus le TmpClass.cpp dans le projet? – SysAdmin

+0

Oui - voir mon commentaire pour répondre 1. – Anamon

Répondre

2

Le comportement que vous décrivez signifie simplement que vous avez oublié d'inclure le fichier TmpClass.cpp dans le projet.

Le compilateur ne peut pas et ne sait pas par magie où les méthodes de classe non-inline sont définies. Il est de votre responsabilité de compiler tous les fichiers .cpp et de les lier ensemble. Dans MSVC, il est normalement fait en ajoutant tous les fichiers .cpp au projet.

+1

Merci pour la réponse, mais le fichier .cpp est ajouté au projet et compile. Comme je l'ai dit, j'ai d'autres fonctions déclarées dans l'en-tête et implémentées dans le fichier .cpp, et ces fonctions fonctionnent, et cela inclut un constructeur non-par défaut. C'est juste le constructeur et le destructeur par défaut qui apparaissent comme non résolus quand ils ne sont pas en ligne. – Anamon

+0

@Anamon - vous avez peut-être inclus le fichier .cpp dans le projet d'application principal. Mais ce n'est pas suffisant pour compiler un de vos projets plugin. vos projets de plugin ne savent jamais où est la définition de votre Ctor et Dtor. – SysAdmin

+0

C'est complètement embarrassant. Je pense que j'ai effectivement traîné le mauvais fichier sur mes projets plugin et ils ne pouvaient pas trouver le fichier .cpp. Je ne devrais pas sous-estimer ma capacité à négliger les choses les plus évidentes. Merci de votre aide! – Anamon

0

Je suppose que vous avez un projet "application principale" et un ou plusieurs projets "plugin" et il semble que vous n'ayez pas inclus TmpClass.cpp dans le projet plugins. Je devine également que "toutes les autres fonctions que vous déclarez dans le .h et l'implémentation dans .cpp" ne sont utilisées que par votre projet principal et non par vos plugins.

Comme d'autres l'ont dit, vous pouvez inclure TmpClass.cpp dans vos projets de plug-ins. L'autre option est de créer un projet "sdk" dll et de lier à la fois le projet principal et le projet plugins.

Si vous pensez toujours que les réponses d'AndreyT sont fausses, vous devriez fournir plus d'informations sur la structure de votre projet.

Questions connexes