Diviser les classes C modélisées en fichiers .hpp/.cpp : est-ce possible ?
Problème :
Tenter de diviser une classe C basée sur un modèle en fichiers .hpp et .cpp entraîne des erreurs de compilation dues aux références non définies au constructeur et au destructeur symboles.
main.cpp:(.text+0xe): undefined reference to 'stack<int>::stack()' main.cpp:(.text+0x1c): undefined reference to 'stack<int>::~stack()'
Code :
stack.hpp
#ifndef _STACK_HPP #define _STACK_HPP template <typename Type> class stack { public: stack(); ~stack(); }; #endif
st ack.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 :
Il n'est pas possible d'implémenter des classes basées sur un modèle dans un fichier .cpp séparé et de les compiler. L'implémentation doit être incluse dans le fichier .hpp car le compilateur nécessite la connaissance du type de données lors de la génération de la disposition de la mémoire et des définitions de méthodes pour les classes de modèles. Tenter de compiler le fichier .cpp indépendamment entraînera les problèmes suivants :
Alternative Solution :
Pour masquer les détails de mise en œuvre, envisagez de séparer les structures de données et les algorithmes. Créez des classes basées sur des modèles pour représenter les structures de données, tandis que les classes non modélisées gèrent les algorithmes et utilisent les structures de données. Cela permet de dissimuler les détails essentiels de l'implémentation dans des bibliothèques distinctes sans recourir aux classes de modèles.
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!