Maison > développement back-end > C++ > Pourquoi est-ce que j'obtiens des références non définies lors de la séparation des implémentations de classe C modélisées en fichiers .hpp et .cpp ?

Pourquoi est-ce que j'obtiens des références non définies lors de la séparation des implémentations de classe C modélisées en fichiers .hpp et .cpp ?

Barbara Streisand
Libérer: 2024-12-28 05:48:15
original
798 Les gens l'ont consulté

Why Do I Get Undefined References When Separating Templated C   Class Implementations into .hpp and .cpp Files?

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();
};
Copier après la connexion

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;
}
Copier après la connexion

main.cpp :

#include "stack.hpp"

int main() {
    stack<int> s;

    return 0;
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal