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 :

heritage et c++


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut heritage et c++
    Cheres amies amis du forum
    je suis sur la création d'un programme d'exercices de calcul mentale. J'ai crée une classe fraction. Je souhaite créer une classe exercice (somme, multiplication,...)qui incorpore des fonctions erreur pour creer des qcm, cependant j'ai un doute est ce que ma classe exercice doit elle hériter de ma classe fraction?
    En règle générale pour mon programme est ce ma classe exercice doit elle herité de toute les classe qui manipule des chiffre.

    merci

  2. #2
    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
    la réponse est non

    vous devriez revoir la signification de l'héritage (au programmation objet, indépendamment de C++)
    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

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    L'héritage est la relation la plus forte que l'on puisse trouver entre deux classes car il s'agit d'une relation EST-UN.

    Tu ne dois réellement l'envisager que si tu peux dire sans l'ombre d'un doute qu'un objet de la classe dérivée EST-UN objet de la classe de base (qu'il peut sans problème passer pour un objet de la classe de base et qu'il peut être utilisé comme tel, quitte à perdre quelques fonctionnalités.)

    Un exercice n'est pas une fraction, pas plus qu'il n'est une addition, une soustraction ou quoi que ce soit: il présente ou il contient l'un ou l'autre de ces objet.

    Par contre, tu pourrais envisager la création d'une classe "Problème" (peut être très mal nommée ici) qui disposerait:
    1. des deux opérandes (gauche et droite)
    2. d'une fonction (virtuelle pure) "afficher"
    3. d'une fonction (virtuelle pure) "resultat"
    Et dont hériteraient les classes fraction, addition, multiplication, etc.

    L'exercice serait alors composé d'un pointeur sur problème, d'une quantité donnée (souvent 4 ) de propositions, et d'une indication sur "la bonne solution".

    Il présenterait (lui aussi), entre autre, une fonction afficher qui invoquerait... la fonction afficher au départ du pointeur de problème.

    Lorsque tu crées ton test (plusieurs exercices ), tu crées chaque exercice séparément en lui passant un "problème" particulier (une fraction ou une addition ou une ...) les propositions et l'indication sur la bonne solution.

    Lors de l'exécution, tu parcourrais alors tous les exercices afin de les faire s'afficher et de gérer la réponse obtenue
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut
    Un grand merci pour toute ces indications elle m'aide beaucoup
    en réalité j'ai reussi à resoudre quasiment tout les probleme inhérent à mon programme, que se soit la generation d'exercice la création de pdf, d'interface graphique pour enregistrer le nouveaux fichiers.
    Il ne me reste que l'interface graphique utilisateur, mais sa je le garde pour lafin.
    J'en suis au stade ou je réecrit mes solutions dans un programme en dur, et c'est la que je bloque je manque de methodologie et de pratique pour pouvoir créer un code cohérent et robuste tous en exploitant au maximum la conception objet pour laquelle vous avez devineé je suis débutant.

  5. #5
    Membre éclairé Avatar de Nono Sto
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 350
    Par défaut Création d'exercice
    Chères amies , amis du forum

    J'ai repris mon vieux projet qui me tiens tant à coeur.

    J'ai essayé d'appliquer les idées de koala01 et voici un premier jet. J'ai essayé d'implémenter deux classes, la classe Probleme et Exercice.

    Toutes les deux sont des classes Template :

    1)j'ai plusieurs type d'opérande, et je souhaite reutilsé mes fonctions

    2) je ne connait pas à l'avance le type de mes opérandes (int, double ou fraction)

    J'ai effectué un test en essayant de creer une variable test issu de la classe Probleme

    Cependant j'ai deux message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1>c:\documents and settings\propriétaire\mes documents\visual studio 2008\projects\numerical_test\numerical_test\main.cpp(12) : warning C4930: 'Probleme<Type1,Type2> test(void)'*: fonction prototypée non appelée (était-ce la définition de variable souhaitée*?)
    et le second qui apparait 15 fois:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c:\documents and settings\propriétaire\mes documents\visual studio 2008\projects\numerical_test\numerical_test\probleme.cpp(3) : error C2955: 'Probleme'*: l'utilisation d'une classe modèle requiert une liste d'arguments modèle
    1>        c:\documents and settings\propriétaire\mes documents\visual studio 2008\projects\numerical_test\numerical_test\probleme.h(12)*: voir la déclaration de 'Probleme'
    Voici mon code:

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
     
    #include "Probleme.h"
    //#include "Exercice.h"
     
    void main()
    {
        Probleme <int,int> test();
     
    }
    Probleme.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #ifndef ProblemeH
    #define ProblemeH
     
    #include <math.h>
    #include <iostream>
    #include <cstdlib>
    #include <ctime>
    #include <string.h>
     
    template <class Type1,class Type2> 
    class Probleme
    {
        private:
                Type1 m_operande_1;
                Type2 m_operande_2;
        public:
                Probleme();
                Probleme(Type1 operande_1,Type2 operande_2);
                ~Probleme();
    };
     
    #endif
    Probleme.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #include "Probleme.h"
     
    Probleme::Probleme()
    {
        int m_operande_1=0;
        int m_operande_2=0;
    }
     
    Probleme::Probleme(Type1 operande_1, Type2 operande_2)
    {
        m_operande_1=operande_1;
        m_operande_2=operande_2;
    }
     
    Probleme::~Probleme()
    {
     
    }
    Exercice.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifndef ExerciceH
    #define ExerciceH
     
    #include "Probleme.h"
     
    template <Probleme *probleme,class Type1,class Type2> 
    class Exercice
    {
        private:
                Probleme *m_probleme;
                Type1 m_proposition [4];
                Type2 m_solution [4];
        public:
                Exercice();
                ~Exercice();                        
    };
     
    #endif
    Exercice.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "Exercice.h"
     
    Exercice::Exercice()
    {
        m_probleme = new Probleme;
        m_proposition [4] = {0};
        m_solution [4] ={0};
    }
     
    Exercice::~Exercice()
    {
        delete m_probleme;
    }
    Est ce que je suis sur la bonne voix, et si oui pourquoi cela ne marche pas.
    merci

  6. #6
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Bonjour,

    Lors de l'utilisation de template, la définition des fonctions doit être dans le .h de la classe. Sois dans la classe elle-même, sois en dessous en redonnant avant chaque fonctions la déclaration des paramètres du template.
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    template <class Type1,class Type2> 
    class Probleme
    {
        private:
                Type1 m_operande_1;
                Type2 m_operande_2;
        public:
                Probleme()
                {
                    int m_operande_1=0;
                    int m_operande_2=0;
                }
     
                Probleme(Type1 operande_1, Type2 operande_2);
     
    };
     
    template <class Type1,class Type2>
    Probleme<Type1,Type2>::Probleme(Type1 operande_1, Type2 operande_2)
    {
        m_operande_1=operande_1;
        m_operande_2=operande_2;
    }
    Edit: Je pense également que on peut les mettrent dans le cpp uniquement si elle sont spécialisées...

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

Discussions similaires

  1. heritage des contraintes
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 30/04/2004, 12h04
  2. [Kylix] heritage multiple et interfaces :(
    Par le_barbu dans le forum EDI
    Réponses: 4
    Dernier message: 26/01/2004, 19h30
  3. [Postgres] Pb d'heritage...
    Par anonia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h34
  4. [HERITAGE] Redondance ou pas redondance ???
    Par cyrillus76 dans le forum Schéma
    Réponses: 1
    Dernier message: 11/06/2003, 09h46
  5. [PostgreSQL] Question vis a vis de l'heritage...
    Par Gandalf dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/05/2003, 16h53

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