La division des classes C basées sur un modèle en fichiers .hpp et .cpp séparés est-elle réalisable ?
Lorsque vous essayez de compiler une classe C basée sur un modèle dans un en-tête séparé (.hpp) et d'implémentation (.cpp), vous pouvez rencontrer des erreurs de liaison. Considérez le code suivant :
// stack.hpp template <typename Type> class stack { // ... };
// stack.cpp template <typename Type> stack<Type>::stack() { // ... }
// main.cpp #include "stack.hpp" stack<int> s;
La compilation échoue avec des erreurs de « référence non définie » pour les méthodes de classe de modèle. Bien que cela soit possible, déplacer toutes les implémentations de méthodes dans le fichier d'en-tête n'est pas une solution idéale.
Pourquoi la compilation séparée échoue pour les classes de modèles
Le problème vient du fait que le modèle les classes ne sont pas entièrement définies au moment de la compilation. Le compilateur génère du code pour des instanciations spécifiques en fonction des paramètres de modèle fournis. Sans les paramètres du modèle, le compilateur ne peut pas générer la disposition de la mémoire et le code pour les méthodes dans le fichier d'implémentation.
Alternative : séparer les structures de données et les algorithmes
Pour masquer les détails d'implémentation tout en maintenant la séparation, envisagez de séparer les structures de données des algorithmes. Les classes modèles doivent principalement définir des structures de données, tandis que les classes d'algorithmes non basées sur des modèles les exploitent ou les utilisent. Cette approche masque efficacement les détails d'implémentation précieux sans avoir besoin de fichiers d'implémentation séparés pour les 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!