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 :

Membres statics avec allocation dynamique


Sujet :

C++

  1. #1
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut Membres statics avec allocation dynamique
    Bonjour,
    je crée une classe, on va dire MonInt, et je veux que mes entiers respectent certaines contraintes.
    Je crée alors une classe Contrainte qui contient seulement la méthode virtuelle suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     virtual verif(Tableau *);
    et deux classes qui héritent de Contrainte, disons ContrainteMin et ContrainteMax, qui ont juste la méthode verif de définie.
    Je crée ensuite une autre classe : Tableau qui est codée de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Tableau
    {
      public :
        ...
      private :
      MonInt tab[30];
      Contrainte * _cte[2];
    }
    Bref jusqu'ici pas de problème, mais je me dis: "t'es bête les contraintes c'est les mêmes pour tous les objets" et donc je me dis : "mets les en static".

    Ma classe devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Tableau
    {
      public :
        ...
      private :
      MonInt tab[30];
      static Contrainte * _cte[2];
    }
    Là, je me dis comment faire pour avoir une initialisation correcte ?
    Je cherche un peu, j'essaye sur des ints, après des int * et j'en viens à ceci pour l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Contrainte * _cte[2] = { new ContrainteMin(), new ContrainteMax() }
    Je n'ai pas trouvé d'autre méthode pour initialiser mes contraintes. (Je ne suis pas sûr qu'il y en ait d'autre).

    Mais là je commence à me dire, ok tu as tes contraintes, mais comment tu fais :
    1. si le new a envoyé une exception bad_alloc
    2. pour faire un delete des Contraintes

    Pour le 1, a part mettre un try et a catch à la ligne d'initialisation, je vois pas comment faire.

    Pour le 2, je fais un delete avec une fonction qui a un acces a mon tableau de contraintes à la fin du programme principal.

    Mais les solutions que j'ai données ne me paraissent pas satisfaisantes du tout.
    Je pense que je ne dois pas faire ceci, si ?

    Une solution plus élégante consisterait a créer une variable pour chaque contrainte (ici ça va car j'en ai que 2), mais comment faire (si c'est possible) pour garder ce que j'ai avant à savoir un tableau de pointeurs sur des Contraintes.

    Merci d'avance.

    Bonne journée.

    b Oo
    b Oo

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Salut !

    Alors, pour tes deux questions :

    1°) bad_alloc au début du programme (variable static) ? ton application tournera jamais, c'est quasi-impossible d'avoir une bad_alloc à ce niveau, sinon ton programme ne tournera jamais ^^

    2°) ce sont de variables statiques, donc elles sont censées être allouées au début du programme et c'est tout...

    Sinon, pourquoi ne pas plutôt adopter quelque chose de ce type ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Tableau
    {
    <div style="margin-left:40px">private:
    <div style="margin-left:40px">static ContrainteMin _min;
    static ContrainteMax _max;</div>public:
    <div style="margin-left:40px">static Contrainte& getContrainte(unsigned i)
    {
    <div style="margin-left:40px">switch(i) {
    <div style="margin-left:40px">case 0 : return Tableau::_min;
    case 1 : return Tableau::_max;
    default : throw bad_argument();</div>}</div>}</div></div>};
    Comme ça, pas d'allocation dynamique et en plus, tu respectes l'encapsulation
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Ah oui c'est vrai que cela n'est pas mal, mais si j'ai 10 000 contraintes, je prefereais les avoir dans un tableau.

    Il n'y a pas de moyens de cumuler les deux avantages ?

    b Oo
    b Oo

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    peut-être un tableau de références...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static Contrainte _cont&[10000] = {ContrainteMax(), ContrainteMin(), ...};
    mais je ne suis pas sûr que ça fonctionne à 100%... il faudrait vérifier que ce n'est pas une copie qui est effectuée...

    Sinon, pourquoi ne pas plutôt rendre la classe contrainte paramètrable (type de contrainte et valeur), comme ça tu n'aurais pas besoin d'utiliser le polymorphisme...

    Tu pourrais même utiliser un foncteur (classe qui surcharge () cf FAQ ) ou un pointeur de fonction (mais ça fait un peu C)... comme ta classe contrainte ne sert qu'à ça...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    J'ai l'impression qu'il serait plus simple de définir une liste des contraintes et d'intégrer la fonction de vérification à la classe Tableau.
    On ne peut pas faire boire un âne qui n'a pas soif.

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

Discussions similaires

  1. Bug avec allocation dynamique de tableaux
    Par yann_m dans le forum Fortran
    Réponses: 3
    Dernier message: 17/02/2009, 11h36
  2. Réponses: 6
    Dernier message: 02/04/2007, 14h20
  3. Pb d'allocation dynamique avec malloc
    Par Magicmax dans le forum C
    Réponses: 5
    Dernier message: 12/12/2005, 01h04
  4. [Debutant] Problème avec des membres static
    Par Mathieu.J dans le forum Débuter
    Réponses: 4
    Dernier message: 24/08/2005, 17h09
  5. [jsp] dessin static avec données dynamique dessus
    Par njac dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 01/07/2004, 16h24

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