Maison >développement back-end >C++ >Les classes C basées sur un modèle peuvent-elles être divisées en fichiers d'en-tête et d'implémentation distincts ?

Les classes C basées sur un modèle peuvent-elles être divisées en fichiers d'en-tête et d'implémentation distincts ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-13 18:55:10435parcourir

Can Templated C   Classes Be Split into Separate Header and Implementation Files?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn