Maison > développement back-end > C++ > Les classes C basées sur un modèle peuvent-elles être divisées en fichiers .hpp et .cpp ?

Les classes C basées sur un modèle peuvent-elles être divisées en fichiers .hpp et .cpp ?

Patricia Arquette
Libérer: 2024-12-22 05:49:08
original
961 Les gens l'ont consulté

Can Templated C   Classes Be Split into .hpp and .cpp Files?

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

Code :

stack.hpp

#ifndef _STACK_HPP
#define _STACK_HPP

template <typename Type>
class stack {
    public:
            stack();
            ~stack();
};
#endif
Copier après la connexion

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

main.cpp

#include "stack.hpp"

int main() {
    stack<int> s;

    return 0;
}
Copier après la connexion

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 :

  • Le fichier objet ne sera pas généré avec les informations de classe.
  • L'éditeur de liens ne trouvera pas les symboles dans les fichiers objets et la construction échouera.

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!

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