Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question constructeur pour un classe

j'ai l'impression que j'ai pas besoins de constructeur "mateo help"

    1 août 2007 à 10:08:40

    bonjour a tous,


    je developpe un projet en c++ avec borldand c++ builder 4 (c'es vraiment formidable de developper avec ce logiciel et ne croyez pas que j'ai des actions de cette boite :)) )

    bref j'expliqe mon probleme :

    voila j'ai plusieurs unités avec soit une classe soit plusieurs classes.

    Il y a une unité à l'intérieur de laquelle j'ai une classe qui me permet de manipuler les grille ( en c++ : les Stringgrid). je n'arrive pas a faire un constructeur !! ,
    toutes mes fonctions on au moins une grille en paramètres, je pense que c'est la un des interets d'un constructeur, c'est justement d'eviter que toutes mes fonctions on en parametre à chaque fois une grille.

    je montre deux fonctions simple que j'utilise :


    // vide un grille
    void TManipGrille::ViderGrille(TStringGrid* stgr)
    {
       for (int j = 1 ; j < stgr->ColCount-1; j++)
        {
           for (int i = 1 ; i < stgr->RowCount-1; i++)
           {
                stgr->Cells[j][i] = "";
           }
        }
    } 
     



    // recupere l'indice d'un colonne choisie par l'utilisateur
    int TManipGrille::GetNumColonne(TStringGrid* stgr, AnsiString nomvar)
    {
     int numCol = 0; // On instancie a 0 le numéro de la colonne
        for (int j = 1 ; j <stgr->ColCount; j++)// On parcourt chaques colonnes
        {
            if (stgr->Cells[j][0] == nomvar) // Dès que le nom de la colonne est égale au nom que le cherche
                numCol = j; // On récupère le numéro de la colonne
        }
            return numCol; // On retourne le num de la colonne
    }
     



    Comment faire un constructeur utile pour cette classe ?
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      1 août 2007 à 10:32:19

      Le constructeur n'est vraiment obligatoire que lorsque tu as des données membres à initialisés automatiquement avant d'utiliser ton objet.
      De cette facon (avec le constructeur), on est sure que si l'allocation de memoire pour l'objet ne foire pas , ton objet est utilisable tout de suite.

      Comme ta classe semble être une classe utilitaire qui na pas de données membre, son constructeur n'est pas obligatoire.

      Par contre , si tu ne manipule qu'une seule et même grille en même temps avec ta classe, il pourrai être intéréssant de crée dans ta classe un pointeur qui pointerai vers cette grille.
      De cette facon , tu éviterai a chaque fois le passage de la grille en paramètre a tes fonction.
      Et si tu souhaite plus tard changer la grille sur lequel le pointeur pointe, il te suffit d'utiliser un accesseur du style : manip.ChangerGrille(grille2);
      • Partager sur Facebook
      • Partager sur Twitter
        1 août 2007 à 10:41:42

        Merci, je vois

        autre question :

        est ce que j'ai le droit de declarer un objet de la classe TManipGrille une seul fois pour une classe ex :

        TManipGrille* grille = new TManipGrille();
        je declare un objet de type TManipGrille et apres j'utilise toujours "grille" pour utiliser toutes les fonctions de cette classe
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          1 août 2007 à 10:59:46

          Oui tu peux et tu doit.
          Car as moins de rendre les fonction statique , tu dois les appeler par un objet.

          Di tu veut être sur de ne pouvoir avoir qu'une seule instance de TManipGrille durant tout ton programme , utilise la classe singleton, ja fais un tuto la dessue dans la section C++ .
          • Partager sur Facebook
          • Partager sur Twitter
            1 août 2007 à 11:11:12

            je vais aller voir ton tuto.

            je repose un peu la même question mais plus précis :
            imagine j'ai un formulaire deux bouton donc j'ai deux "void __fastcall" ( 1 pour chaque bouton)
            dans ces 2 boutons je doit utiliser "TManipGrille"

            est-ce que je peux declarer en global un objet avec new
            ou
            je suis obliger dans chaque bouton (dans chaque void __fastcall) declarer un objet avec un new ?
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              1 août 2007 à 11:25:08

              void __fastcall ?
              Qu'est ce que c'est ?
              • Partager sur Facebook
              • Partager sur Twitter
                1 août 2007 à 11:32:46

                je develope avec borland c++ builder
                et quand j'utilise un un objet type buttton ou n'importe textbox
                et que je fais une action dessus j'ai ça :

                "void __fastcall TFrmPrincipale::Button1Click(TObject *Sender)
                {
                // mon code
                ShowMessage("hello")
                }"
                tu vois ? la c'est lorsque l'utilisateur clique sur le bouton 1 alors un message apparait "hello"
                je repose ma question avec ça :
                "void __fastcall TFrmPrincipale::Button1Click(TObject *Sender)
                {
                // mon code
                TManipGrille* grille = new TManipGrille();
                }"

                "void __fastcall TFrmPrincipale::Button2Click(TObject *Sender)
                {
                // mon code
                TManipGrille* grille = new TManipGrille();
                }"


                la j'ai deux new 1 pour chaque boutton est-ce que je peux faire un new gloabal à la classe pour ne pas réécrire "TManipGrille* grille = new TManipGrille(); " 2 fois ? et donc gagner des lignes de codes, moins d'allocation mémoires ,ect...
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  1 août 2007 à 11:55:15

                  Tu peut faire un new global a la classe dans son constructeur ou utiliser le singleton résoud aussi ce problème.

                  Avec un singleton , ton code deviendrai un truc du genre :


                  {
                  // mon code
                  TManipGrille* grille = TManipGrille::GetInstance();
                  }

                  void __fastcall TFrmPrincipale::Button2Click(TObject *Sender)
                  {
                  // mon code
                  TManipGrille* grille = TManipGrille::GetInstance();
                  }
                   


                  A toi de voir ce que tu prèfere :
                  Le new global est simple est rapide mais ne bloque pas le nombre d'instance.
                  Le singleton est plus lourd a mettre en place , ne permet d'avoir qu'une seule instance mais t'assure un acces global sans nouvelle allcation a ta classe.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    1 août 2007 à 12:13:08

                    je ne trouve pas ton tuto dans la rubrique c++
                    i y a celui la de mateo et un autre mais c'es pas ton pseudo ?

                    tu peut mettre le lien
                    • Partager sur Facebook
                    • Partager sur Twitter
                      1 août 2007 à 13:54:55

                      j'ai lu ton tuto

                      c'est bien.
                      Tu montre les templates choses que je ne sais pas trop utilise mais qui sont pour moi le top de la programmation.

                      j'ai compris en gros ton principe de classe singleton mais c'e pas très evidement.
                      je comprend pas comment ton obj2 est instancié, (c'est à dire qu'il a la valeur 5) ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        1 août 2007 à 15:36:38

                        obj1 et obj2 ne sont pas instancié.
                        On se contenet de les faire pointer sur m_singleton contenue dans la classe Singleton.
                        C'est m_singleton qui est instancié au 1er appel de GetInstance().
                        • Partager sur Facebook
                        • Partager sur Twitter
                          1 août 2007 à 16:12:31

                          Citation : Davidbrcz

                          void __fastcall ?
                          Qu'est ce que c'est ?


                          c'est simplement pour dire comment sont gérés les arguments des fonctions :
                          - tout sur la pile
                          - les 4 premiers dans les registres et le reste sur la pile
                          - ...
                          y'a un article sur wikipedia : http://en.wikipedia.org/wiki/X86_calling_conventions#Borland_fastcall
                          • Partager sur Facebook
                          • Partager sur Twitter
                            1 août 2007 à 16:15:15

                            Ça ou tu défini une instance de ta classe dans la classe TFrmPrincipale.

                            Tu l'instancie dans le constructeur de cette classe et tu le détruit dans son destructeur. Même si c'est du code auto-généré tu peux lui ajouter des composantes sans problème.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Question constructeur pour un classe

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown