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++

  1. #1
    Membre régulier
    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

    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 sénior
    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 régulier
    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 régulier
    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:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />robleme()
    {
        int m_operande_1=0;
        int m_operande_2=0;
    }
     
    Probleme:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />robleme(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 expérimenté
    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>:<img src="images/smilies/icon_razz.gif" border="0" alt="" title=":P" class="inlineimg" />robleme(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...
    Homer J. Simpson


  7. #7
    Invité
    Invité(e)
    Bonjour,
    Moi, j'ai une question pour Nono_Sto.
    Votre but est-il de créer un programme de calcul mental ou d'apprendre l'utilisation des template, et des classes en général?

  8. #8
    Membre régulier
    Cheres amies, amis

    J'ai repris vos indications, alors pour ma classe Probleme elle s'instancie sans aucun soucis.

    Par contre ma classe Exercice ne fonctionne pas.
    Voici les 2 erreurs que m'affiche mon compilateur:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    error C2975: 'Exercice'*: argument template non valide pour 'probleme', expression constante évaluée au moment de la compilation attendue


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    error C2514: 'Exercice'*: la classe n'a aucun constructeur


    mon main:

    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
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
     
    #include "Probleme.h"
    #include "Exercice.h"
     
    void main()
    {
        int a = 0;
        int b = 0;
     
        int tab1 [4]={0};
        int tab2 [4]={0};
     
        Probleme <int,int> test(a,b);
        Exercice <Probleme,int, int> test2(*test, tab1, tab2);
    }


    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    #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:
            //constructeurs
                Probleme()
                {
                    int m_operande_1=0;
                    int m_operande_2=0;
                }
     
                Probleme(Type1 operande_1, Type2 operande_2)
                {
                    m_operande_1=operande_1;
                    m_operande_2=operande_2;
                }
            //destructeur
                ~Probleme()
                {
     
                }    
    };
    #endif


    Exercice

    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
    24
    25
    26
    27
    28
    29
    30
    31
    #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()
                {
                    m_probleme = new Probleme;
                    m_proposition [4] = {0};
                    m_solution [4] = {0};
                }
                Exercice(Probleme *probleme,Type1 proposition [4],Type2 solution [4])
                {
                    m_probleme = new Probleme;
                    m_proposition [4] = proposition [4];
                    m_solution [4] = solution [4];
                }
                ~Exercice()
                {
                    delete m_probleme;            
                }
    };
    #endif


    Merci

  9. #9
    Membre régulier
    Cheres amies amis du forum

    j'ai repris ma classe Exercice, et j'ai besoin d'intancier des tableuax.
    Pour cela j'utilise la classe vector, cependant je n'arrive pas instancier mes deux vecteur dans le constructeurs

    Pourriez vous m'aider SVP

    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
    24
    25
    26
    27
    28
    #include "Probleme.h"
     
    template <Probleme *probleme, class Type1,class Type2> 
    class Exercice
    {
        private:
                Probleme *m_probleme = NULL;
                vector <Type1> m_proposition;
                vector <Type2> m_solution;
        public:
                /*Exercice()
                {
                    m_probleme = new Probleme;
                    <Type1> m_proposition(4);
                    <Type2> m_solution(4);
                }*/
                Exercice(Probleme *probleme,Type1 proposition(4),Type2 solution(4))
                {
                    m_probleme = new Probleme;
                    <Type1> m_proposition(4);
                    <Type2> m_solution(4);
                }
                ~Exercice()
                {
                    delete m_probleme;            
                }
    };
    #endif

  10. #10
    Membre chevronné
    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
    #include "Probleme.h"
     
    template <Probleme *probleme, class Type1,class Type2> 
    class Exercice
    {
        private:
                Probleme *m_probleme;
                vector <Type1> m_proposition;
                vector <Type2> m_solution;
        public:
     
                Exercice(Probleme *probleme)
       : m_probleme(NULL),m_proposition(4), m_solution(4)
                {
                    m_probleme = new Probleme;
                }
                ~Exercice()
                {
                    delete m_probleme;            
                }
    };
    #endif


    je t'enjoindrasi à lire un cours de base de C++, il te manque qqs notions de base

  11. #11
    Membre régulier
    Merci beaucoup

  12. #12
    Membre régulier
    J'ai essayé de lancer mon main mais je ne connais pas la syntaxe adéquate pour instancier une classe template composé à la fois d'un type "fixe" ici de classe Probleme et deux "type non fixe".

    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
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
     
    #include "Probleme.h"
    #include "Exercice.h"
     
    void main()
    {
        int a = 0;
        int b = 0;
     
        int tab1 [4]={0};
        int tab2 [4]={0};
     
        Probleme <int,int> test(a,b);
        Exercice <*probleme ,int, int> Exo(*test);
    }

  13. #13
    Membre régulier
    on m'a aide à réercrir mon code et cela donne ceci

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #ifndef ProblemeH
    #define ProblemeH
     
    #include <ctime>
    #include <vector>
    #include <math.h>
    #include <cstdlib>
    #include <string.h>
    #include <iostream>
     
    template <class Type1,class Type2>
    class Probleme
    {
        private:
            typedef Type1 type_1;
            typedef Type2 type_2;
     
            type_2 m_operande_1;
            type_2 m_operande_2;
     
        public :
            Probleme() : m_operande_1(), m_operande_2()
                {
                }
     
            Probleme(type_1 operande_1, type_2 operande_2) : m_operande_1(operande_1), m_operande_2(operande_2)
                {
                }
     
            ~Probleme()
                {
                }
    };
    #endif


    Exercice
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    #ifndef ExerciceH
    #define ExerciceH
     
    #include "Probleme.h"
     
    template <class Type1,class Type2>
    class Exercice
    {
        private :
            typedef Type1 type_1;
            typedef Type2 type_2;
     
            Probleme<type_1, type_2> *m_probleme;
            std::vector<type_1> m_proposition;
            std::vector<type_2> m_solution;
     
        public :
            Exercice(): m_probleme(new Probleme<type_1, type_2>),m_proposition(4), m_solution(4)
    			{
    			}
     
    		Exercice(const Probleme<type_1, type_2>& probleme): m_probleme(& probleme),m_proposition(4), m_solution(4)
    			{
    			}
     
            ~Exercice()
    			{
    				delete m_probleme;
    			}
    };
    #endif


    mais je n'arrive pas instancier un objet Exercice dans mon main.
    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
    #include <time.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <iostream>
     
    #include "Probleme.h"
    #include "Exercice.h"
     
    int main()
    {
        int a = 1;
        int b = 2;
        double c = 3;
     
        Probleme <int,int> test(a,b);
        Exercice <int, int> Exo(&test);
     
        return 0;
    }


    Pourriez vous me donner la bonne syntaxe SVP.

    Merci

  14. #14
    Membre actif
    Des includes entre <> que tu fais, aucune n'est utile. De plus tu mélanges les includes du C et celles du C++.

    -> <ctime> c'est du C++, <time.h> du C. Préfère ceux du C++ en C++.
    -> <string.h> devient <cstring> mais préfère les std::string de <string>.
    -> n'inclus que le strict minimum.

    Tu devrais revoir la théorie sur les pointeurs et les références, c'est exactement ça ton problème (à la lecture du code à froid). & signifie deux choses différentes, tout dépend du contexte. Je te laisse revoir la théorie, je suis un peu trop paresseux là pour la recopier.

    Fait gaffe aussi que tes pointeurs soient valides.

    Et soigne ton indentation! Ça fait mal à voir...

###raw>template_hook.ano_emploi###