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 :

Aide exercice C++


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut Aide exercice C++
    Bonjour,

    Dans le cadre de l'apprentissage des bases de C++, je cherche à répondre le probleme suivant, qui ne doit pas présenter de difficultés particulières je pense mais je suis novice et c'est pas facile au départ.
    Auriez vous svp des éléments de réponses à apporter?
    Merci par avance!

    Soit la classe C++ suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Contenu 
    { 
    Public : int x ; 
    int y ; 
    Contenu() {} ;// le contenu des fonctions n’a pas été défini et donc ne peut // être considéré comme étant une erreur de syntaxe 
    int Execute() {} ; 
    void Print() {} ; *
    } ;

    Questions :
    1 – Cette classe vous semble-t-elle correcte syntaxiquement ?
    2 – La notion d’encapsulation au sens C++ est – elle présente dans cette classe ? Justifiez dans les 2 cas (oui ou non) votre réponse. Au cas où il n’y a pas d’encapsulation dans cette classe, proposez la mise en oeuvre de cette notion au sein de cette classe.
    3 – Cette classe peut-elle être une classe de base dans le cas de l’héritage ? Justifiez votre réponse. Répondre oui ou non tout simplement ne constituera pas une réponse valide.
    4 – Que signifie le polymorphisme au sens C++ ?
    5 – Citez deux cas ou la notion de polymorphisme est utilisée en C++.
    6 – Pour que cette classe soit une classe abstraite, que doit-elle contenir ? Cette notion a des incidences sur son utilisation. Citez-en au moins 2.
    7 - Modifier cette classe pour qu’elle puisse accepter tous types de données (char, int, float, double, pointeur, …). Imaginez dans cette version de la classe, un cas d’application en définissant tous les membres. Chaque membre correspond à votre vision d’un traitement qu’il peut faire. Créez des objets sur cette classe dans tous les cas de figures (type de données proposé ci-dessus).dans une fonction main() par exemple.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Par défaut
    T'as pas eu le cours qui va avec?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut
    En fait, j'essaye de me former un peu tout seul, donc j'ai trouvé deux trois cours sur internet, mais je galere...tu peux m'aider un petit peu tu penses?
    merci a toi!

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Par défaut
    Citation Envoyé par xuantran Voir le message
    Bonjour,

    Dans le cadre de l'apprentissage des bases de C++, je cherche à répondre le probleme suivant, qui ne doit pas présenter de difficultés particulières je pense mais je suis novice et c'est pas facile au départ.
    Auriez vous svp des éléments de réponses à apporter?
    Merci par avance!

    Soit la classe C++ suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Contenu 
    { 
    Public : int x ; 
    int y ; 
    Contenu() {} ;// le contenu des fonctions n’a pas été défini et donc ne peut // être considéré comme étant une erreur de syntaxe 
    int Execute() {} ; 
    void Print() {} ; *
    } ;

    Questions :
    1 – Cette classe vous semble-t-elle correcte syntaxiquement ?
    2 – La notion d’encapsulation au sens C++ est – elle présente dans cette classe ? Justifiez dans les 2 cas (oui ou non) votre réponse. Au cas où il n’y a pas d’encapsulation dans cette classe, proposez la mise en oeuvre de cette notion au sein de cette classe.
    3 – Cette classe peut-elle être une classe de base dans le cas de l’héritage ? Justifiez votre réponse. Répondre oui ou non tout simplement ne constituera pas une réponse valide.
    4 – Que signifie le polymorphisme au sens C++ ?
    5 – Citez deux cas ou la notion de polymorphisme est utilisée en C++.
    6 – Pour que cette classe soit une classe abstraite, que doit-elle contenir ? Cette notion a des incidences sur son utilisation. Citez-en au moins 2.
    7 - Modifier cette classe pour qu’elle puisse accepter tous types de données (char, int, float, double, pointeur, …). Imaginez dans cette version de la classe, un cas d’application en définissant tous les membres. Chaque membre correspond à votre vision d’un traitement qu’il peut faire. Créez des objets sur cette classe dans tous les cas de figures (type de données proposé ci-dessus).dans une fonction main() par exemple.
    tu debutes en C++ mais c'est un exercices qui utilise des notions avancées en C++ et orienté objet ex: polymorphisme, templates(patrons) essaie plutot avec des exemples plus simple programme des classes simples pour t'entrainer et après pas à pas avance sinon si tu tiens j peux repondre mais tu n comprendras pas grand chose

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par xuantran Voir le message
    1 – Cette classe vous semble-t-elle correcte syntaxiquement ?
    : Page Outils&Compilateurs.
    Citation Envoyé par xuantran Voir le message
    2 – La notion d’encapsulation au sens C++ est – elle présente dans cette classe ? Justifiez dans les 2 cas (oui ou non) votre réponse. Au cas où il n’y a pas d’encapsulation dans cette classe, proposez la mise en oeuvre de cette notion au sein de cette classe.
    F.A.Q. : Qu'est-ce que l'encapsulation ?

    Citation Envoyé par xuantran Voir le message
    3 – Cette classe peut-elle être une classe de base dans le cas de l’héritage ? Justifiez votre réponse. Répondre oui ou non tout simplement ne constituera pas une réponse valide.
    F.A.Q. Pourquoi le destructeur d'une classe de base doit être public et virtuel ou protégé et non virtuel ?

    Citation Envoyé par xuantran Voir le message
    4 – Que signifie le polymorphisme au sens C++ ?
    F.A.Q. Qu'est-ce que le polymorphisme ?

    Citation Envoyé par xuantran Voir le message
    5 – Citez deux cas ou la notion de polymorphisme est utilisée en C++.
    F.A.Q. Qu'est-ce que le polymorphisme ?

    Citation Envoyé par xuantran Voir le message
    6 – Pour que cette classe soit une classe abstraite, que doit-elle contenir ? Cette notion a des incidences sur son utilisation. Citez-en au moins 2.
    F.A.Q. Qu'est-ce qu'une classe abstraite ?

    Citation Envoyé par xuantran Voir le message
    7 - Modifier cette classe pour qu’elle puisse accepter tous types de données (char, int, float, double, pointeur, …). Imaginez dans cette version de la classe, un cas d’application en définissant tous les membres. Chaque membre correspond à votre vision d’un traitement qu’il peut faire. Créez des objets sur cette classe dans tous les cas de figures (type de données proposé ci-dessus).dans une fonction main() par exemple.
    F.A.Q Qu'est-ce qu'un template ?

  6. #6
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Par défaut
    Citation Envoyé par xuantran Voir le message
    Bonjour,

    Dans le cadre de l'apprentissage des bases de C++, je cherche à répondre le probleme suivant, qui ne doit pas présenter de difficultés particulières je pense mais je suis novice et c'est pas facile au départ.
    Auriez vous svp des éléments de réponses à apporter?
    Merci par avance!

    Soit la classe C++ suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Contenu 
    { 
    Public : int x ; 
    int y ; 
    Contenu() {} ;// le contenu des fonctions n’a pas été défini et donc ne peut // être considéré comme étant une erreur de syntaxe 
    int Execute() {} ; 
    void Print() {} ; *
    } ;

    Questions :
    1 – Cette classe vous semble-t-elle correcte syntaxiquement ?
    2 – La notion d’encapsulation au sens C++ est – elle présente dans cette classe ? Justifiez dans les 2 cas (oui ou non) votre réponse. Au cas où il n’y a pas d’encapsulation dans cette classe, proposez la mise en oeuvre de cette notion au sein de cette classe.
    3 – Cette classe peut-elle être une classe de base dans le cas de l’héritage ? Justifiez votre réponse. Répondre oui ou non tout simplement ne constituera pas une réponse valide.
    4 – Que signifie le polymorphisme au sens C++ ?
    5 – Citez deux cas ou la notion de polymorphisme est utilisée en C++.
    6 – Pour que cette classe soit une classe abstraite, que doit-elle contenir ? Cette notion a des incidences sur son utilisation. Citez-en au moins 2.
    7 - Modifier cette classe pour qu’elle puisse accepter tous types de données (char, int, float, double, pointeur, …). Imaginez dans cette version de la classe, un cas d’application en définissant tous les membres. Chaque membre correspond à votre vision d’un traitement qu’il peut faire. Créez des objets sur cette classe dans tous les cas de figures (type de données proposé ci-dessus).dans une fonction main() par exemple.
    1)Si on definit les fonction en même temps que la déclaration on doit mettre le nom de la classe avant la déclaration, public c'est sans majiscule donc vous aurez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Contenu 
    { 
    public : int x ; 
    int y ; 
    Contenu::Contenu() {} ;// le contenu des fonctions n’a pas été défini et donc ne peut // être considéré comme étant une erreur de syntaxe 
    int Contenu::Execute() {} ; 
    void Contenu::Print() {} ; *
    } ;
    2)l'encapsulation consiste à rendre tout les attributs privée et les methodes public comme ça tu testes avant toute modification donc vous aurez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Class Contenu 
    { 
    private
    int x , y; 
    public:
    Contenu::Contenu() {} ;// le contenu des fonctions n’a pas été défini et donc ne peut // être considéré comme étant une erreur de syntaxe 
    int Contenu::Execute() {} ; 
    void Contenu::Print() {} ; *
    } ;
    3)On peut hériter de n'importe quel classe donc cette classe peut être une classe de base dans le cas de l'héritage sauf que pour les classes vraiment de base on utilise plus des classe abstraite

    4)le polymorphise c'est definir un code pour qu'il reagisse diferemment selon le type utilisé

    5)il existe 4 type de polymorphisme:
    -La surcharge de fonctions
    -Les conversions implicites
    -Le polymorphisme paramétrique
    -Le polymorphisme d'inclusion

    6)Pour que la classe devienne abstraite on met dans la declaration apès le nom de la classe abstract et on definit aucune methode et on ajoute virtual avant le type de retour des methodes pour les attributs ils doivent etre protected pour permettre leur heritage. Cela implique qu'on ne peut pas instancier d'objet directement de cette classe elle est utilisée seulement comme classe de base pour d'autre classe

    7)tu doit definir un template ex: template<typename T>
    tu dois après declarer tes attributs de ce type pour le main j te laisse le soin de l'écrire
    j'espere que j'ai été claire sinon tu peux demander plus d'explication

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 10
    Par défaut Merci
    Merci infiniment.
    Je vais me pencher la dessus.
    Bonne soirée.

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    En temps normal, on ne répond pas aux questions des exos posés.
    Mais bon, quand les réponses sont fausses ...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Janvier 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2010
    Messages : 73
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    En temps normal, on ne répond pas aux questions des exos posés.
    Mais bon, quand les réponses sont fausses ...
    ça serait sympas de signaler les fautes que tu as detecter, je crois que c'est meilleur de critiquer et laisser les autres se lancer sur des pistes fausses

  10. #10
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Par défaut
    Soit, je corrige tes fautes :

    1) Il faut mettre le nom de la classe seulement si on définis les fonctions en dehors de la classe elle même :

    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
    class Truc
    {
    public :
     
        void UneFonction()
        {
            // ...
        }
     
        void UneAutreFonction();
    };
     
    void Truc::UneAutreFontion()
    {
        // ...
    }
    Le c++ n'est pas (totalement) illogique
    Quand tu est dans la classe, tu ne peux définir que des fonctions qui lui appartiennent : répéter le nom de la classe est donc inutile.
    En revanche, si tu définis la fonction en dehors, le compilateur a besoin de savoir s'il s'agit d'une fonction libre (comme sqrt() ou autre) ou d'une méthode de la classe Truc.

    3) Non, le destructeur n'est pas virtuel.

    4) Le polymorphisme tel que je le conçois, c'est ça :
    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
    class Base
    {
    public :
        // ...
     
        virtual void UneFonction();
    };
    class Derivee1 : public Base
    {
    public :
        // ...
     
        void UneFonction();
    };
    class Derivee2 : public Base
    {
    public :
        // ...
     
        void UneFonction();
    };
     
    int main()
    {
        Base* b[2];
     
        // On peut stoquer des pointeurs vers Derivee1 et Derivee2 dans un pointeur vers Base
        b[0] = new Derivee1();
        b[1] = new Derivee2();
     
        b[0]->UneFonction(); // appelle Derivee1::UneFonction, même si b[0] est du type Base
        b[1]->UneFonction(); // appelle Derivee2::UneFonction, même si b[1] est du type Base
    }
    6) Le mot clé abstract n'existe pas en C++. Une classe abstraite est une classe qui ne peut être instanciée car elle contient au moins une méthode virtuelle pure (mais elle peut aussi contenir des méthodes normales, virtuelles ou non) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Base
    {
    public :
     
        Base();
        virtual ~Base();
     
        virtual void UneFonction() = 0;
    };
    Vu que sont but est d'être dérivée, elle doit aussi posséder un destructeur virtuel.

  11. #11
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par Kalith Voir le message
    4) Le polymorphisme tel que je le conçois, c'est ça :
    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
    class Base
    {
    public :
        // ...
     
        virtual void UneFonction();
    };
    class Derivee1 : public Base
    {
    public :
        // ...
     
        void UneFonction();
    };
    class Derivee2 : public Base
    {
    public :
        // ...
     
        void UneFonction();
    };
     
    int main()
    {
        Base* b[2];
     
        // On peut stoquer des pointeurs vers Derivee1 et Derivee2 dans un pointeur vers Base
        b[0] = new Derivee1();
        b[1] = new Derivee2();
     
        b[0]->UneFonction(); // appelle Derivee1::UneFonction, même si b[0] est du type Base
        b[1]->UneFonction(); // appelle Derivee2::UneFonction, même si b[1] est du type Base
    }
    Non, c'est un abus de langage, ça c'est du polymorphisme d'inclusion. Il en existe d'autre forme en cpp. (paramétrique etc)...

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    1- C'est faux pour le nom, et des erreurs stupides de syntaxes sont toujours présentes -- certains compilateurs tolèrent, mais pas tout le temps.
    3DArchi a donné une excellente réponse à la RTFM : UTFC.

    2- C'est beaucoup plus subtil que cela. Il s'agit de cacher les détails de fonctionnement qui aident à mettre en oeuvre l'abstraction.
    Parfois, l'abstraction, ce sont les données, et alors les passer en privé n'encapsule rien du tout.

    3- Vrai dans l'absolu, mais il reste des règles à respecter pour avoir des comportements corrects. 3DArchi a listé ceux relatifs à la destruction polymorphique, on peut aussi parler de ceux relatifs à l'incompatibilité de la sémantique de valeur avec un héritage.

    6- Aucun rapport avec la visibilité. 3DArchi a une fois de plus donné la réponse.
    Accessoirement, l'implémentation du pattern NVI dans la FAQ laisse les fonctions membre virtuelles en privé.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Je pense que toutes les bonnes réponses sont dans la F.A.Q comme je l'ai indiqué. Je rajouterais qu'il y a beaucoup d'informations complémentaires qui aident à répondre à ces questions dans la F.A.Q. Je ne les ai pas toutes citées. Le lecteur curieux sait aussi aller plus loin que la première réponse.

    Dans un certain sens je me demande si la meilleur réponse à la question 3 sur l'héritage n'est pas encore de dire que l'aspect syntaxique n'a rien à voir avec l'héritage qui est d'abord un concept à utiliser dans une conception dans un objectif bien précis (abstraction par expl). Donc demander si une classe est propice à l'héritage pris en dehors d'un contexte est quasiment une question insensée

    @xuantran : je me permets de traduire Luc : Use The Fucking Compilator ! Ou dit autrement : vérifier la correction lexicale et syntaxique sur une feuille papier est débile. Donc la question de ton prof est stupide. J'écris tout les jours des lignes qui ne compilent pas dès la première fois car j'ai oublié un ';', j'ai mis une majuscule au mauvais endroit, ou je ne sais quoi encore. On ne connait pas un langage parce qu'on sait voir les ';' qui manque et les majuscules au mauvais endroit.

    @Kalith : le polymorphisme c'est un peu plus que ce que tu décris.

    @kalith : le destructeur doit être virtuel s'il est public ou protégé s'il est non virtuel. On peut donc très bien utiliser une classe pour l'héritage si son destructeur n'est pas virtuel mais protégé. Juste qu'on ne pourra pas détruire un objet à partir d'un pointeur de sa classe de base.

    @kalith : on ne recommandera jamais assez la traduction de thinking in C++ proposée par dvp ainsi que le reste des cours proposés.

    @xuantran : comment tu vas faire le jour de l'exam sans accès à dvp.com ? Faire un effort pour réviser ses cours et chercher les réponses aux questions que te pose ton prof, ça te permettra de plus facilement apprendre que d'obtenir des réponses toutes faites.

  14. #14
    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
    Citation Envoyé par xuantran Voir le message
    Bonjour,

    Dans le cadre de l'apprentissage des bases de C++, je cherche à répondre le probleme suivant, qui ne doit pas présenter de difficultés particulières je pense mais je suis novice et c'est pas facile au départ.
    Auriez vous svp des éléments de réponses à apporter?
    Merci par avance!

    Soit la classe C++ suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Contenu 
    { 
    Public : int x ; 
    int y ; 
    Contenu() {} ;// le contenu des fonctions n’a pas été défini et donc ne peut // être considéré comme étant une erreur de syntaxe 
    int Execute() {} ; 
    void Print() {} ; *
    } ;

    Questions :
    1 – Cette classe vous semble-t-elle correcte syntaxiquement ?
    Syntaxiquement, oui... elle sera acceptée à la compilation
    2 – La notion d’encapsulation au sens C++ est – elle présente dans cette classe ? Justifiez dans les 2 cas (oui ou non) votre réponse. Au cas où il n’y a pas d’encapsulation dans cette classe, proposez la mise en oeuvre de cette notion au sein de cette classe.
    L'encapsulation consiste à faire en sorte que l'utilisateur de la classe n'ai pas d'accès au "détails d'implémentation" de celle-ci... qu'en penses-tu

    Citation Envoyé par ridick Voir le message
    1)Si on definit les fonction en même temps que la déclaration on doit mettre le nom de la classe avant la déclaration, public c'est sans majiscule donc vous aurez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Contenu 
    { 
    public : int x ; 
    int y ; 
    Contenu::Contenu() {} ;// le contenu des fonctions n’a pas été défini et donc ne peut // être considéré comme étant une erreur de syntaxe 
    int Contenu::Execute() {} ; 
    void Contenu::Print() {} ; *
    } ;
    Quelle horreur... justement pas...

    Tu peux définir une fonction (qui sera considérée implicitement comme inline) directement au sein de la définition de la classe sans préciser que... tu définis effectivement une fonction membre de la classe...

    Mais le fait que la fonction soit implicitement considérée comme inline place certaines restrictions (entre autres au niveau des fonctions virtuelles)

    C'est lorsque, justement, tu ne définis pas les fonctions membres au sein de la définition de la classe que tu dois préciser la portée complete sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <type de retour> <nom de la classe>::<nom de la fonction>(<liste d'arguments>) <cv-qualifier de la fonction>
    {
        <corps de la fonction>
    }
    3)On peut hériter de n'importe quel classe donc cette classe peut être une classe de base dans le cas de l'héritage sauf que pour les classes vraiment de base on utilise plus des classe abstraite
    encore une fois NON...

    du moins, pas dans l'optique d'un héritage public, avec la notion polymorphe qu'il entraine.

    En effet, si tu a le malheur de faire passer un objet de la classe dérivée pour la classe de base telle qu'elle est décrite ici et de détruire l'objet en question, seul le destructeur de la classe de base sera appelé, les membres propres aux classes dérivées ne seront donc pas détruit, et tu t'orientes tout droit vers... de fantastiques fuites mémoire... dans le meilleur des cas.

    En effet, lorsque le compilateur ne rencontre pas de déclaration du constructeur, il en place un "par défaut" qui
    1. est public
    2. est inline
    3. est non virtuel
    4. appelle le destructeur des membres dans l'ordre inverse de leur déclaration

    Un tel destructeur ne respecte pas le minimum requis pour une utilisation polymorphe
    6)Pour que la classe devienne abstraite on met dans la declaration apès le nom de la classe abstract et on definit aucune methode et on ajoute virtual avant le type de retour des methodes pour les attributs ils doivent etre protected pour permettre leur heritage. Cela implique qu'on ne peut pas instancier d'objet directement de cette classe elle est utilisée seulement comme classe de base pour d'autre classe
    Là aussi, j'ai l'impression que tu t'es trompé de langage...

    Le mot clé abstract n'existe pas en C++

    Pour qu'une classe soit considérée comme abstraite, il "suffit" qu'une des fonctions membres soit virtuelle pure.

    Toute classe dérivant d'une classe abstraite et ne redéfinissant pas la fonction virtuelle pure sera elle aussi considérée comme une classe abstraite
    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

  15. #15
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    Puisque cette question de type 'faites mes devoirs' sollicite beaucoup de réaction, profitons en pour chipoter un peu

    Citation Envoyé par koala01 Voir le message
    Syntaxiquement, oui... elle sera acceptée à la compilation
    Telle que l'a écrite le posteur, il y a des erreurs de casses (Class/class, Public /public,) un '*' qui traine à la fin de la fonction Print. Les ';' après les définitions de fonction, là j'avoue que je ne sais pas si c'est syntaxiquement autorisé. gcc dit rien en mode ansi+pedantic et visual non plus.
    Pour les problèmes de casses et pour le '*', la réponse est non. Mais, comme je l'ai dit et comme l'a souligné Luc : UTFC. Ce sont typiquement (et tu en fais involontairement la preuve) des erreurs que l'on fait tous les jours, qu'on ne trouve pas forcément en relecture ... et que le compilateur trouve très bien pour nous. Donc, c'est complètement stupide (du moins c'est mon avis) de poser ce genre de question en exam.

    Citation Envoyé par koala01 Voir le message
    L'encapsulation consiste à faire en sorte que l'utilisateur de la classe n'ai pas d'accès au "détails d'implémentation" de celle-ci... qu'en penses-tu
    Voilà typiquement le genre de question qui me parait dénuée de sens lorsqu'elle prise en dehors de tout contexte : x et y sont-ils des détails d'implémentation ou des 'services triviaux' de la classe Contenu ? std::pair a les membres first et second en public et pourtant personne ne pense que l'encapsulation est brisée. Il en est peut être de même pour Contenu et x et y...
    [mode capilotracté] D'ailleurs, toutes les fonctions de Contenu sont définies et aucune d'entre elles n'utilise ni x ni y. Donc x et y ne sont pas des détails d'implémentation mais des bien des services offerts par Contenu. Donc la réponse est oui : l'encapsulation est respectée.
    [/mode capilotracté]

    Citation Envoyé par koala01 Voir le message
    Mais le fait que la fonction soit implicitement considérée comme inline place certaines restrictions (entre autres au niveau des fonctions virtuelles)
    Je précises que le lien entre fonctions virtuelles et fonctions inline se résume dans la phrase : les fonctions virtuelles ne peuvent être expansées par le compilateur lorsque l'appel implique une résolution dynamique. C'est la seule restriction. Dans tous les autres cas, il n'y a pas de problème. Entre autres, une fonction virtuelle peut être expansée en ligne si l'appel peut être résolu statiquement (par expl, dans le constructeur/destructeur ou si l'appel se fait avec une variable par valeur)

    Citation Envoyé par koala01 Voir le message
    du moins, pas dans l'optique d'un héritage public, avec la notion polymorphe qu'il entraine.
    En effet, on pourrait répondre à la normande :
    -> oui si l'héritage est privé,
    -> non si l'héritage est public.
    mais comme dit précédemment, cette question n'a aucun sens si on la prend dans une optique strictement syntaxique.

    Citation Envoyé par koala01 Voir le message
    seul le destructeur de la classe de base sera appelé
    Pour continuer dans le chipotage, en fait, le comportement est indéterminé. Donc, ça pourra faire ce que tu dis ... ou bien faire le café

    Citation Envoyé par koala01 Voir le message
    En effet, lorsque le compilateur ne rencontre pas de déclaration du constructeur, il en place un "par défaut" qui
    lire destructeur


    @Slash86,@Bnj1391,@xuantran : si vous pouvez indiquer à votre prof de venir faire un tour ici, je serais assez curieux de sa justification à ces questions. Car :
    1/ Ne montre en rien la connaissance ou non du langage ni de sa syntaxe.
    2/ Parler de respect ou non de l'encapsulation présuppose qu'on définit d'abord ce que propose la classe comme service. Ensuite on montre son code. Et là on regarde s'il y a des trucs 'visibles' qui ne devraient pas. En dehors de tout contexte, cette question n'a pas de sens.
    3/Idem : sans contexte sémantique, cette question ne peut avoir de réponse consensuelle.
    4/ Comment a-t-il été défini en cours ? Si c'est tel que nous le dit Slash86, alors là, effectivement vous êtes mal barré.
    7/ Je comprend même pas la question si ce n'est qu'on sent bien que le prof veut des exemples de générique.

Discussions similaires

  1. Aide exercice de math/Algorithmique
    Par laurent2628 dans le forum Mathématiques
    Réponses: 11
    Dernier message: 10/06/2008, 13h24
  2. Aide exercices Java débutant
    Par dalil777 dans le forum Général Java
    Réponses: 9
    Dernier message: 08/02/2008, 22h19
  3. Aide exercice C
    Par lkaiman dans le forum C
    Réponses: 3
    Dernier message: 31/12/2007, 12h57

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