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 :

Class, tableaux de class :(


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut Class, tableaux de class :(
    Bonjour à tous,

    Question de debutant

    J'ai une "class C_objet" avec constructeur qui a dans ses membres une variable tableau de "class C_element".
    Cette "class C_element" n'a pas de constructeur (pour pouvoir avoir un tableau de plusieurs "element" dans les objets, dite moi si je me trompe) et chaque nouvel "element" est initialisée par l'appel d'une fonction "element->initElement" généré par la fonction "objet->initObjet".

    Mes questions :
    1. Chaque "objet" créé est-il detruit automatiquement avant la fin du programme ou faut-il que je le fasse par le destructeur.
    2. La destruction d'un "objet" entraine-t-elle celle des "element" que l'"objet" a crée?

    3. Si j'utilise new dans le constructeur de "C_objet" pour creer un "element" (Ex : element = new C_element; ). New ne fait qu'allouer la memoire pour un element de type C_element? New n'appelle pas le constructeur?

    4. Qd je fait C_objet objet(argument du contructeur); objet est un pointeur?
    Merci d'avance pour vos reponses

  2. #2
    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
    Trop tard pour ce que je reponde point par point. D'autant que je ne suis pas sûr si tu entends tableau statique ou dynamique par juste tableau.

    Bref, dans tous les cas, std::vector est ami. Tu pourras avoir tes éléments construits à la bonne valeur (sans nécessiter ces horreurs que sont les fonctions d'initialisation), et les avoir automatiquement libérés sans avoir à te soucier de la gestion de la mémoire. Et en plus, c'est dynamiquement, et simplement, redimensionnable.
    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...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 55
    Par défaut
    Merci de ta reponse,

    J'ai debuté il y a peu en C et je m'attaque au C++.
    Donc malgrè le très bon bouquin Kernighan-Ritchie (le language C), j'ai encore du mal avec les pointeurs surtout sur char.
    Les exemple des bouquins je les comprends parfaitement, j'arrive à appliquer sur des petites fonctions. Mais là, les classes imbriquées avec dans les arguments des tableaux de pointeurs sur char, ce fut laborieux.
    Bon il faut continuer pour se familiariser avec tout ca.
    Il faut vraiment que je passe à la class string. Donc comme tu l'as dit je vais aller voir dès demain du coté class vector


    Au final ma classe "c_objet" a dans ses membres un tableau de pointeur sur classe "c_element".
    J'appelle chaque "element" avec :
    element = new C_element (arguments constructeur C_element);
    Et ca marche !

    j'attends avec impatience tes reponses, pour etre sur d'avoir compris. Parce que ca fini par marcher mais tout cela est loin d'etre fluide.

  4. #4
    Invité
    Invité(e)
    Par défaut
    La facon de penser en C++ ne doit pas etre celle d'un "raisonnement en C adapté au C++".

    la bibliotheque standard du C++ fournit des containers appropriés pour le stockage dynamique d'éléments.

    as tu essayé l'utilisation de std::vector<> ?

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

    Dans un premier temps, la plupart des tableaux de char que tu utilise (et leur pointeurs associés) devraient avantageusement pouvoir etre remplacés par des std::string et référence (constante ou non) dessus dans le prototye de fonction.

    Si, vraiment, il faut que tu récupère la chaine de caractères sous forme d'un tableau de char terminé par '\0' (ouverture de fichiers, par exemple), tu pourras toujours y ariver avec la méthode string.c_str()

    Comme l'a si bien dit luc, la classe std::vector<type d'élément> est ton amie, pour la très grosse majorité des cas où tu aurais utilisé, en C, un tableau (hormis, peut etre, les chaines de caractères qui ont intéret à etre std::string... et encore, tu peux créer un tableau de string sous la forme de std::vector<std::string> )

    Pour la théorie "minimale" concernant les structures et les classes en C++, on peut dire qu'elles sont fort semblables...

    Elles permettent toutes les deux de définir un type utilisateur (finalement, comme ce qui se fait en C), d'y placer des membres et des méthodes.

    La seule différence tient en la visibilité (accessibilité) par défaut des membres et methodes:

    Dans une structure, la visibilité des membres et méthodes est publique, alors qu'elle est privee dans une classe.

    Ainsi, si tu as une structure et une classe sous la forme de
    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
     
    struct mastruct
    {
        type membre1;
        type membre2;
        void fonction1();
        void fonction2();
    };
    class maclass
    {
        type membre1;
        type membre2;
        void fonction1();
        void fonction2();
    };
    membre1,membre2, fonction1(), fonction2() sont accessibles par d'autres fonctions dans le cas de mastruct alors qu'ils ne sont accessibles que par maclass dans maclass

    En ce qui concerne les membres:
    - s'il sont gérés de manière statique, il seront automatiquement détruits lorsque tu détruit l'objet qui les contient.

    - s'ils sont gérés de manière dynamique (créés avec new/new[]), il faudra détruire les membres explicitement dans le destructeur (avec delete/delete[])

    -S'il s'agit de conteneurs (std::vector,std::dequeue,std::list et autres), il est prudent de demander explicitement de les vider (surtout si les conteneurs contiennent des pointeurs alloués dynamiquement)

    Le destructeur d'une classe sera systématiquement appelé, dans le cadre d'un objet statique (maclass monobjet) lorsqu'on sort de la protée d'où il a été déclaré ou, s'il est géré dynamiquement (maclasse *objet=new objet) lorsque l'on décidera de le libérer (delete objet) et appellera, s'il y a un héritage, automatiquement le(s) destructeur(s) de la (des) classe(s) héritée(s)

    Ce texte n'étant qu'un résumé très succint de la manière d'utiliser des classes, tu comprendras surement qu'il n'a pas pour vocation d'être complet, ni meme forcément tres précis... Disons, qu'il a juste pour vocation de te permettre d'avoir un appercu général de ce que peut etre une classe... de les "démystifier" d'une certaine manière
    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

  6. #6
    Invité
    Invité(e)
    Par défaut
    koala01, les struct en C n'autorisent pas d'avoir des fonctions membres, et les opérateur de visibilité (public, protected, private) n'existent pas non plus... (mais c'est juste un détail)

  7. #7
    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 toxcct
    koala01, les struct en C n'autorisent pas d'avoir des fonctions membres, et les opérateur de visibilité (public, protected, private) n'existent pas non plus... (mais c'est juste un détail)
    Je me doutais que j'aurais cette réponse...

    A vrai dire le "ce qui se fait en C" avait trait au fait qu'une structure ou une classe permet de définier des types personnalisés...

    Je savais bien que ma tournure de phrase porterait à confusion sur ce que je voulais réellement dire, mais je ne voyais pas comment la tourner autrement

    J'ai donc décidé d'attendre d'avoir l'occasion de préciser ma pensée
    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

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

Discussions similaires

  1. class pour table + class pour td = class td non fonctionnelle ?
    Par supergrey dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/05/2009, 08h13
  2. [Débutant] Tableaux et classes
    Par Rakken dans le forum Langage
    Réponses: 2
    Dernier message: 16/03/2009, 10h36
  3. soucis sur les tableaux de class
    Par estacado dans le forum ASP
    Réponses: 1
    Dernier message: 07/05/2007, 10h43
  4. [Tableaux] Interrogation classe et boucle
    Par masseur dans le forum Langage
    Réponses: 6
    Dernier message: 27/09/2006, 20h53
  5. [Tableaux] [Débutant ) Classes
    Par Halobox dans le forum Langage
    Réponses: 5
    Dernier message: 12/01/2006, 15h50

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