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 :

Aide sur un exam


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Par défaut Aide sur un exam
    Salut à tous.

    J'ai un exam de C++ cette semaine. J'ai le sujet de l'année dernière, j'aurais aimé avoir vos avis sur quelques questions.

    Soit la classe C++ suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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() {} ;
     } ;
    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.



    Alors, concernant les réponses que j'apporterai :

    1. Syntaxiquement, rien n’est mauvais dans cette classe.

    2. L’encapsulation est mal fait. Les attributs ne sont pas déclarés en Private. Pour la mise en œuvre je rajoute un private où je met les attributs dedans.

    3. Cette classe ne peut pas servir pour l’héritage car elle ne contient pas de d’encapsulation protected nécessaire.

    4. Le polymorphisme sert a utiliser une même classe sur des contenus différents. On ne peut effectivement pas traiter des entiers comme des chaînes de caractères.

    5. Si on souhaite traiter 2 types différents en appelant la même classe ? L’autre je sais pas.

    6 et 7. J’en ai aucune idée …

    Vous pensez quoi de mes réponses ? Est-ce que vous avez la réponse à celle manquante ?

    ps : Ne me dites pas que je suis une brêle, vous ne m'apprendrez rien

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 480
    Par défaut
    Hello,

    Citation Envoyé par kennyflorian Voir le message
    1 – Cette classe vous semble-t-elle correcte syntaxiquement ?
    - Encore une classe C++ écrite à la mode Java ! :-) « class » et « public » doivent être écrits en minuscules.

    - Les méthodes sont inline. Rien d'incorrect à cela si tant est que ce soit clair dans l'esprit du programmeur qui a rédigé cette classe, ce qui est loin d'être certain.

    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 est mal faite. Les attributs ne sont pas déclarés en Private. Pour la mise en œuvre je rajoute un private où je met les attributs dedans.

    En l'occurence, si tu déclares les membres en question comme étant privés, tu ne pourras jamais attribuer de valeur à x ou y, ni appeler les méthodes que tu déclares (pas même dans une classe dérivée car il faudrait, en C++, que ces membres soient déclarés protected).

    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.
    Et pourquoi pas ? Il n'y a pas de classe finale en C++

    3. Cette classe ne peut pas servir pour l’héritage car elle ne contient pas de d’encapsulation protected nécessaire.

    En l'occurence, ce n'est pas un problème puisque tous les membres sont publics. Si tous les membres étaient private, dériver cette classe ne servirait pas à grand chose, si ce n'est donner la nature de la classe Contenu à la classe-fille, mais ça ne l'empêcherait pas d'être étendue.

    4 – Que signifie le polymorphisme au sens C++ ?
    J'avoue que les avis divergent, mais il semblerait qu'en C++, la bonne réponse soit « l'utilisation de méthodes virtuelles ». Mais bon, la surcharge en est un exemple également.

    4. Le polymorphisme sert a utiliser une même classe sur des contenus différents. On ne peut effectivement pas traiter des entiers comme des chaînes de caractères.

    On n'utilise pas une « classe » sur un « contenu ». On instancie un objet d'une classe particulière et on passe des données à ses méthodes, ou on en remplit directement ses variables membres.

    5 – Citez deux cas ou la notion de polymorphisme est utilisée en C++.
    Voir au-dessus.

    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.
    C'est dans la FAQ. Voir « méthode virtuelle pure ».

    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.
    « Créer des objets sur cette classe » ne veut rien dire. Ensuite, « accepter tous les types », c'est très ambigü, également. Le bon sens voudrait que l'on utilise les templates mais je ne pense pas que ce soit ce qui t'est demandé. S'il s'agit de surdéfinir toutes les méthodes pour accepter les différents types, c'est possible aussi mais dans ce cas-là, il faut avoir un ensemble fini de cas de figures à prendre en charge. Les « ... » entre tes parenthèses me posent problème.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    1: Je ne sais pas si c'est une erreur de recopie ou d'énnoncé, mais c'est class et public, le C++ est sensible à la case. Public != public.

    2: Encapsulation, ce n'est pas juste mettre des données en private, c'est avant tout forcer les clients à ignorer les détails d'implémentation de la classe. Ici, il n'y a pas d'encapsulation pour x et y, mais il se pourrait que de les mettre en publique soit logique selon une certaine conception. Cf ici pour plus de détails sur cette notion

    3: Elle peut (pourquoi ne pourrait t'elle pas ?), mais aucun intéret dans l'état actuel des choses pour un polymorphisme dynamique (pas de fonctions virtuelles).

    4: Voir la définition de JMB ici. Elle n'est pas facile à comprendre, mais très riche

    Mais en gros, tu as la surcharge de fonctions, les templates, et le polymorphisme dynamique

    5: Cas 1: Traiter de la même manière une collection hétérogène d'objet mais disposant d'une interface commune (polymorphisme dynamique).
    Cas 2: ne pas avoir à dupliquer du code (template)

    y'en a encore d'autre.

    6: la classe doit au moins contenir une fonction virtuelle pure. Dès lors, elle n'est plus instanciable et toute classe dérivée doit redéfinir la fonction virtuelle pure

    7: C'est avec les templates, sauf que je ne vois pas ce que ton prof souhaite.

    PS/ il est vraiment mal posé cet exam.
    PS2/ Pense aussi à regarder les FAQ
    PS3/ Grilled ><'
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    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,

    1. syntaxiquement, en dehors des erreurs de majuscules, cette classe est incorrecte: une définition de fonction ne doit jamais être suivie par un point virgule ";" (je capillotracte, mais certains compilateur émettent un avertissement sur ce point )
    2. le principe de l'encapsulation n'est pas respecté car pour ce faire, nous pourrions penser qu'il serait bien plus aisé de placer x et y dans une accessibilité privée
      • pas dans le cadre d'un héritage plublic: Le destructeur par défaut fournit par le compilateur - parce qu'il n'y en a pas de déclaré - est public et non virtuel, or, deux possibilités sont offertes pour utiliser une classe comme base d'une autre
        • un destructeur public virtuel
        • un destructeur protégé non virtuel
      • Dans le cadre d'un héritage non public (protégé ou privé), cette classe conviendra

    3. Le terme polymorphisme est à utiliser lorsque deux classes appartenant à une même hiérarchie d'héritage vont réagir différemment à l'appel d'une méthode identique
    4. il y en a tellement
    5. Au moins une fonction virtuelle pure
      • la classe elle-même n'est pas instanciable
      • les classes dérivées doivent définir la fonction virtuelle pure pour etre instanciables
    6. 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
       
      /* adaptation sans correction des problèmes ;) */
      template <typename T>
      Class Contenu { 
      Public : 
      T x ; 
      T y ; 
      Contenu() {} ;
      /* j'ai considéré le retour comme une valeur de réussite et non comme
       * le résultat de l'exécution ;)
       * 
       * autrement, ce serait
       *  T execute(){}
       */ 
      int Execute() {} ; 
      void Print() {} ;
       } ;
    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

Discussions similaires

  1. demande d'aide sur samba
    Par marcoss dans le forum Développement
    Réponses: 5
    Dernier message: 04/12/2003, 19h38
  2. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19
  3. Réponses: 2
    Dernier message: 27/02/2003, 01h33
  4. [Kylix] Aide sur BitBlt
    Par mic006 dans le forum EDI
    Réponses: 1
    Dernier message: 10/12/2002, 22h54
  5. Aide sur une fenetre
    Par Ray-j dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 29/11/2002, 08h51

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