Diviser les classes C modélisées en fichiers .hpp/.cpp
Problème :
Compilation une classe de modèle C divisée entre les fichiers .hpp et .cpp entraîne des erreurs de référence non définies pour le membre du modèle fonctions.
Code :
stack.hpp :
template <typename Type> class stack { public: stack(); ~stack(); };
stack.cpp :
#include <iostream> #include "stack.hpp" template <typename Type> stack<Type>::stack() { std::cerr << "Hello, stack " << this << "!" << std::endl; } template <typename Type> stack<Type>::~stack() { std::cerr << "Goodbye, stack " << this << "." << std::endl; }
main.cpp :
#include "stack.hpp" int main() { stack<int> s; return 0; }
Réponse :
Explication :
Il Il n'est pas possible de diviser l'implémentation d'une classe basée sur un modèle en fichiers .cpp distincts pour la compilation. Les fichiers d'en-tête sont uniquement prétraités et ne contiennent pas le code réel.
Processus de compilation :
Lors de la compilation, le code d'en-tête prétraité est combiné avec le fichier .cpp. Cependant, pour les classes de modèles, le compilateur a besoin d'informations sur le type de données du modèle pour générer la disposition de la mémoire et les définitions de méthode.
Problème de fichier cpp séparé :
Déplacement de la méthode Les définitions dans un fichier cpp distinct sans instancier la classe de modèle dans le fichier d'en-tête ne généreront pas les informations de fichier objet nécessaires. Par conséquent, l'éditeur de liens ne peut pas trouver les symboles, ce qui entraîne des erreurs de référence non définies.
Approche alternative :
Pour séparer l'interface de la mise en œuvre, envisagez de séparer les structures de données des algorithmes. Les classes de modèles doivent représenter uniquement des structures de données. Les algorithmes peuvent être implémentés dans des bibliothèques de classes distinctes non modélisées qui interagissent avec ou utilisent les classes modèles. Cette approche permet de masquer des détails de mise en œuvre précieux.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!