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

Langage C++ Discussion :

System - Event / Template => undefined reference


Sujet :

Langage C++

Vue hybride

Whyzix System - Event / Template =>... 05/04/2010, 22h24
TNT89 Un problème d'héritage de... 06/04/2010, 12h52
Whyzix J'ai essayé et cela n'a rien... 06/04/2010, 14h59
bruno_pages Bonjour, je viens de... 06/04/2010, 15h14
Whyzix Merci d'avoir essayé sous... 06/04/2010, 15h26
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut System - Event / Template => undefined reference
    Bonjour,
    Je développe actuellement un programme qui a pour but de modéliser des systèmes en interaction. Pour l'instant, il s'inspire de ce tutorial (les modules étant ici remplacer par des systèmes). Dans mon application, un système est un objet pouvant recevoir des messages (éventuellement d'autres systèmes) et les traiter.

    Ma bibliothèque possède actuellement trois interfaces :
    - ISystem : modélise un système pouvant recevoir des évènements
    - IEvent : représente les évènements envoyés aux systèmes
    - ISystemCore : correspond à la logique d'exécution d'un système
    Et une classe :
    - System : classe héritant d’ISystem, construit autour d'un ISystemCore et pouvant recevoir des évènements

    Avec ces interfaces et cette classe, un système peut être décomposé en deux parties avec d'une part la réception des messages et d'autre part leur traitement et l'évolution de celui-ci.

    Actuellement une première application a été développée. Elle contient deux classes abstraites : ASystemCore et AEvent, héritant respectivement de ISystemCore et IEvent, ainsi que deux "SystemCore" et deux "Event" qui eux héritent de ASystemCore et AEvent.
    Cette construction permet aux "SystemCore" et aux "Event" de posséder des méthodes communes (héritées de ASystemCore et AEvent) permettant l'identification automatique des objets qui leurs sont passés en paramètre.

    Jusqu'ici tout fonctionne, mais je ne suis pas très satisfait de mes interfaces. Pour que l'identification des objets se fasse correctement, je dois définir, dans mes interfaces, des méthodes prenant en compte mes classes abstraites. J'impose donc aux utilisateurs de ma bibliothèque d'utiliser comme classes abstraites ASystemCore et AEvent.

    Pour remédier à cela, j'ai décidé d'utiliser, les templates pour indiquer à mes interfaces les classes abtraites qui seront utilisées. Une deuxième version a donc été développée.
    Le problème, c'est qu'ici, l'édition des liens ne se passe pas correctement (présence "undefined reference"). Les destructeurs (virtuel pur) de deux de mes interfaces (IEvent et ISystemCore) ne sont pas trouvés ainsi que le constructeur de ma classe System.

    Voici le lien vers le code source de ces deux applications (les problèmes étant dans la deuxième). N'étant pas un expert en C++, je suis ouvert à toutes critiques sur ma conception.

    Merci d'avance.

  2. #2
    Membre éclairé Avatar de TNT89
    Inscrit en
    Juillet 2007
    Messages
    358
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Juillet 2007
    Messages : 358
    Par défaut
    Un problème d'héritage de classe template?

    Je crois que tu peux utiliser une syntaxe du style pour supplanter les méthodes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    template<typename T>
    struct Mere
    {
        T methode(void) {/* par exemple */}
    };
     
    template<typename T>
    struct Fille : Mere<T>
    {
        using Mere<T>::methode;
    };
    A vérifier cependant...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    J'ai essayé et cela n'a rien donné.

    De toute façon, les classes (mères) sont des interfaces. Donc leurs méthodes sont virtuelles pures.

    Pour les destructeurs virtuels purs, j'ai trouvé une méthode (que je n'aime pas vraiment). Je les déclare seulement en virtuel et je mets leur code (vide) dans la déclaration de l'interface.

    Sinon il me reste toujours le constructeur (introuvable) de la classe System.

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    Bonjour,

    je viens de récupérer la chose au bout du lien cité dans la premier message et je n'ai pas d'erreur si je compile sous Linux (comme il n'y a pas de Makefile j'ai fait ca via des find ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    /local/System % find Framework Application -name "*.cpp" -exec g++ -c {} \;
    /local/System % g++ *.o
    /local/System % ./a.out
    VisionSystemCore : VisionEvent
    IASystemCore : IAEvent
     
    Press enter to continue ...
    /local/System %
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 10
    Par défaut
    Merci d'avoir essayé sous Linux, mais vous avez testé le 1er programme (qui marche correctement).

    Le programme avec les Template se trouve dans le 2ème dossier : SystemWithTemplate

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 545
    Par défaut
    j'avais pas vu

    les définitions des operations des classes template utilisant les paramètres formels doivent aussi être placées dans les .h, pas des .cpp, vous devez comprendre que les templates sont des sortes de macros
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Template et "undefined reference to operator<<"
    Par coberle dans le forum C++
    Réponses: 15
    Dernier message: 19/03/2013, 09h07
  2. Réponses: 6
    Dernier message: 08/01/2012, 09h05
  3. Réponses: 8
    Dernier message: 20/03/2011, 02h21
  4. " undefined reference to " avec methode template
    Par coldrink dans le forum Langage
    Réponses: 3
    Dernier message: 24/10/2009, 20h05
  5. [Template] Templates et undefined reference
    Par FadeOut dans le forum C++
    Réponses: 9
    Dernier message: 12/12/2008, 17h04

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