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

  1. #21
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    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

  2. #22
    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
    Points : 13 017
    Points
    13 017
    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.

  3. #23
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Slash86 Voir le message
    1) Pour les gens soucieux de la déontologie, rassurez-vous, vous n'avez pas donné les réponses à un genre de "devoir maison" et offert gratuitement une bonne note à un noob, en effet, il s'agit juste d'une anale non corrigée en vue d'un examen

    2) Finalement, même si ca se fait pas de poser des question brutes comme ca, au moins il faut admettre que ca semble vous avoir fait réfléchir puisque vous semblez n'être pas tous d'accord !
    Allez, il faut avouer qu'un peu de réflexion sur les principes théoriques ne fait pas de mal de temps en temps (Bon je dis ca ... mais si seulement j'y comprenais quelque chose ... :s )
    1) Ouais, mais bon, vous donner la réponse sans que vous n'ayez pris la peine d'y réfléchir préalablement ne va nullement vous aider à mieux réussir votre exam.

    2) La communeauté C++ aime beaucoup pinailler. Ce n'est pas une question de réfléchir ou de ne pas être d'accord, car au fond avec 3DArchi et Koala, nous en savons autant sur ces sujets.

    Mais comme le dit, encore, 3DArchi, c'est le contexte qui fait tout. Et suivant le contexte d'étude, la réponse donnée sera différente. D'où les réponses apparemment différentes : nos différences de sensibilité font que par défaut on se place tous dans des contextes subtilement différents.

    Pour la définition du polymorphisme, il est clair que les définitions inexploitables, qui se veulent synthétiques, hantent les étudiants et la toile. De temps en temps on en croise une jolie, qui veut dire quelque chose, et qui est juste. (Merci à Jean-Marc pour celle que nous avons dans la FAQ.)

    PS: les questions de l'exo me font dire que votre prof sait qu'il n'existe pas que le polymorphisme d'inclusion. Et pourtant la définition me donne l'impression qu'il ne connait que celle-ci.
    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...

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