IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

partager une class template par plusieurs class


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut partager une class template par plusieurs class
    Bonjour.

    Tout est dit dans le titre.

    J'ai une class template que j'aimerais utiliser en tant que std::shared_ptr < ClassTemplate < OBJECT_X > > _maClass ; par plusieurs objects.

    Quand je l'utilise dans un seul object, ca marche, et j'ai accès au template. Mais quand j'essaye de faire de même avec une autre class, il me dit error :

    'ClassTemplate' was not declared in this scopeé'.

    Pensez vous que cela soit normal ?

    Merci si vous pouvez m'aider

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    Prions pour que ma boule de cristal soit assez réparé.

    A priori, ca manque d'un include.
    Et éventuellement, d'utiliser le nom qualifié (avec les namespaces, donc).

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut
    Oui, bien vu.

    En fait ca manquait pas d'un include, il y en avait un de trop. Je me suis un peu embrouillé et j'avais oublié d'enlever un #include inutile dans mon template qui cassait la hierarchie.
    Bref, en fait ca marche.

    Merci

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    Ca veut dire que le fichier inclus par cet include en trop est sale.
    essaie de le nettoyer.

    Un include ne doit jamais pourrir un code:
    • avoir une garde contre la double inclusion
    • ne pas contenir de using (hors d'une classe, s'entend)
    • de préférence définir son contenu dans un namespace
    • Si possible, ne pas définir de macro. En général, il vaut mieux les définir dans le .cpp définissant ce que l'en-tête déclare.
    • Toute fonction libre définie doit être marquée inline.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    521
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2014
    Messages : 521
    Points : 136
    Points
    136
    Par défaut


    Je vois que j'ai encore beaucoup de choses à apprendre. Merci pour ces conseils. Je vais veiller à les appliquer au mieux.

    ps : quel est le risque si on utiliser 2 fois le même include dans une hierarchie ?

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 162
    Points
    17 162
    Par défaut
    Que veux tu dire par "dans une hiérarchie"?
    Un #include, c'est une commande au préprocesseur, reconnaissable au # en début de ligne.

    Quand on demande au compilateur de faire son travail, il y a trois grandes étapes:
    1. le preprocessing (un mot français?)
    2. la compilation en tant que telle
    3. l'édition de lien

    Par exemple, la commande gcc main.cpp lib.cpp -o programme se décompose ainsi:
    • preprocessing de main.cpp
    • compilation du résultat
    • preprocessing de lib.cpp
    • compilation du résultat
    • concaténation des deux fichiers compilés et édition de lien.


    La phase du préprocesseur consiste à parcourir ligne à ligne le fichier source.
    Pour l'essentiel il a deux fonctions: remplacer les macros qu'il trouve, et executer les commandes qui lui sont adressées (lignes commençant par un #).
    Une fois ce traitement fait, il copie la ligne dans le fichier résultat.

    Le traitement d'un #include, c'est juste d'insérer avant la prochaine ligne le contenu du fichier inclus.

    Le fichier résultat contient un code source atomique, nommé par la norme unité de compilation.

    La conséquence, c'est que le code qui sert au compilateur ne contient réellement qu'un seul fichier, sans include.
    C'est la que le mot clé extern prend son sens. (et le fait que toute déclaration de fonction est extern)
    extern signifie que la chose ainsi marquée n'est que déclarée, et sera défini dans une unité de compilation externe à la présente.

    La règle de la définition unique dit que chaque chose utilisée doit être définie une et une seule fois dans l'ensemble du programme.
    C'est pourquoi un include ne doit pas contenir de définitions: pour éviter d'avoir la définition d'une même chose dans plusieurs unités différentes.
    inline permet justement de circonvenir à cette règle.

    Après la compilation de chaque unité de compilation, l'édition de liens fait le lien entre chaque symbole simplement déclaré et sa définition unique.
    C'est pour ca que tu peux avoir des erreurs d'éditions de liens dites "undefined reference to ..." avec ... un nom bizarre.

    Tout ca pour dire qu'un #include ne connais pas le code.
    Ce n'est pas son problème.
    Le C++ en lui-même viendra plus tard.

    En fait, tu pourrais même utiliser le préprocesseur C++ avec des fichiers ne contenant pas du C++, mais autre chose, comme des fichiers de configuration.


    Montre nous un peu plus de code, contenant tes deux includes, et le fichier inclus, si possible.
    On pourra te dire le risque potentiel.

    ps: merci bacelar pour la correction.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 145
    Points : 12 251
    Points
    12 251
    Par défaut
    Par exemple, la commande gcc main.cpp lib.cpp -o programme se décompose ainsi:

    •preprocessing de main.cpp
    •compilation du résultat
    •preprocessing de main.cpp lib.cpp
    •compilation du résultat
    •concaténation des deux fichiers compilés et édition de lien.


Discussions similaires

  1. [Débutant] Partager une même propriété entre plusieurs classes
    Par BasicZX81 dans le forum VB.NET
    Réponses: 4
    Dernier message: 09/09/2012, 15h56
  2. Réponses: 4
    Dernier message: 20/10/2009, 08h54
  3. Réponses: 7
    Dernier message: 01/02/2008, 14h16
  4. variable utilisée par plusieurs classes
    Par yasmine* dans le forum Langage
    Réponses: 9
    Dernier message: 08/02/2007, 15h44
  5. Paramètre par défaut class templates
    Par Alp dans le forum C++
    Réponses: 2
    Dernier message: 26/02/2006, 02h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo