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
Patricia Arquetteoriginal
2024-12-22 05:49:08960parcourir

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()'

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 :

  • 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!

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