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 :

instanciation d'une classe


Sujet :

C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut instanciation d'une classe
    hello,

    bon j'ai une question idiote... Je débute en C++, je débute en gtk--, et je suis un peu perdu, alors posons une question idiote
    (il se peut que je dise n'importequoi, n'hésitez pas, même prière de corriger )

    En java, dans une classe "myClass_A", si je définis un attributs de classe"att" de type "myClass_B" (ou B est une autre classe), "att" n'est qu'une référence non initialisée... Si je veux une instance, je dois instancier "att" en appelant son constructeur.

    Je pense qu'il en est de même pour le C++.
    Pourtant, lorsqu'on utilise des widget comme par exemple un CheckButton, il suffit de placer le widget en attribut de classe, et ensuite on peut l'utiliser tel quel... sans instanciation, pas un new CheckButton...

    Quelle est l'explication ?
    Merci

  2. #2
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Bonjour,

    C'est tout simplement parce qu'il existe deux méthodes pour instancier une classe :
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Gtk::Widget *p_w = new Gtk::Widget ();
    Mais tu trouveras sûrement plus de précision dans le forum C++ ainsi que dans les tutoriels

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    hmm... c'est très intéressant ça...
    Mais alors, dans une classe, toutes les classes déclarées en les attributs de classe sont instanciées ???

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

    Informations professionnelles :
    Activité : aucun

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

    De manière générale, il faut s'inquéter de savoir si la mémoire nécessaire pour le membre est géré statiquement ou dynamiquement...

    N'oublie pas que la différence entre l'instance d'une variable déclarée statiquement et celle d'une variable dont la mémoire est allouée dynamiquement tient en ce que celle déclarée statiquement cesse d'exister dés que l'on sort de la portée où elle a été délcarée, alors qu'une variable dont la mémoire est allouée dynamiquement continue à exister jusqu'à ce qu'on libère explicitement la mémoire

    La différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void mafonct()
    {
        int num;
        //...
    }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void mafonct2()
    {
        int *ptrnum=new int;
        //...
    }
    tient donc au fait que obj cesse d'exister dés que l'on quitte mafonct(), alors que, ptrnum continuera à exister apres etre sorti de mafonct2(), tant que l'on ne l'aura pas explicitement supprimé de la mémoire...

    Tant que l'on garde la valeur de ptrnum (qui est l'adresse à laquelle se trouve réellement l'entier) quelque part, on pourra donc y accéder "n'importe où" du moment que cette valeur est connue

    Avec les membres de classes, c'est le meme principe:

    Si le membre est déclaré de manière statique (disons plutot "de manière non dynamique" pour éviter toute confusion avec le mot clé static ) l'instance du membre est créée automatiquement lorsque la classe est créée, et détruite automatiquement quand la classe cesse d'exister.

    Il est vraissemblable de penser que le constructeur se chargera de lui donner une valeur cohérente... quitte à ce que la valeur représente "non encore définie"

    Si le membre est géré de manière dynamique (ou plutot, pour etre complet: si la mémoire nécessaire au membre est gérée de manière dynamique), l'existance de l'instance du membre *peut* être indépendante de l'existance de la classe qui l'utilise (dans le cas, entre autre, le membre pointant sur le noeud "parent" d'un arbre )... à condition bien sur que l'on dispose d'un autre moyen pour y accéder par la suite

    Il est donc envisageable de créer (dynamiquement) une instance du membre, bien avant, ou bien apres celle de l'objet qui l'utilise comme membre et de passer l'adresse à laquelle se trouve le membre au constructeur pour l'initialisation, ou à une fonction qui se chargerait de faire le lien et de détruire l'instance de l'objet "contenant" à un moment pour ne détruire le membre que plus tard... Du moins, tant que l'on garde une autre possibilité pour accéder à l'instance du membre

    Mais il est aussi possible que l'existance du membre dépende directement de l'existance de l'objet de la classe contenante.

    Dans ce cas, l'allocation dynamique du membre se fera, vraissemblablement, dans le constructeur, et la libération se fera, en tout état de cause, dans le destructeur...

    Evidemment, il est possible que l'instance du membre ne soit créée que plus tard (et l'adresse à laquelle se trouve l'instance passée à la classe grace à une fonction prévue pour) et détruite lors de la destruction de celle de l'objet contenant (cas des noeuds de listes/abres), dans le destructeur...
    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

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Citation Envoyé par drKzs
    En java
    Citation Envoyé par koala01
    N'oublie pas que
    N'oublions pas qu'il débute en C++ et vient du Java.
    Donc pour faire court :

    En Java on ne manipule QUE des pointeurs sur objets, d'où l'obligation du NEW pour allouer l'espace mémoire. Le garbage collector se charge de libérer la mémoire quand l'objet n'est plus utile.

    En C++ on peut manipuler des pointeurs sur les objets (cf. l'étoile *, le NEW, le DELETE) ou instancier des objets (pas d'étoile, et la déclaration est suivi de manière transparente par l'instanciation. la destruction de l'objet est automatique cf. durée de vie des objets)

    CCL
    :
    Java MaClass maVar = new MaClass(); (on manipule l'objet au travers d'un pointeur)
    C++ MaClass maVar; (on manipule l'objet directement) ou MaClass* ptrMaVar = new MaClass(); (on manipule l'objet au travers d'un pointeur)

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Septembre 2003
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 506
    Par défaut
    Avec (un peu!) de retard, merci pour toutes ces réponses Déstabilisant au départ, mais on s'y fait, bien que je trouve java un peu plus intuitif

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 04/10/2006, 15h45
  2. Instanciation d'une classe dans un CustomTag
    Par santana2006 dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 30/09/2006, 12h08
  3. Réponses: 2
    Dernier message: 21/04/2006, 20h18
  4. instanciation d'une classe
    Par firejocker dans le forum C++
    Réponses: 6
    Dernier message: 15/11/2005, 11h54
  5. Réponses: 7
    Dernier message: 10/11/2005, 10h09

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