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 :

Que pensez-vous de ma classe tableau ?


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut Que pensez-vous de ma classe tableau ?
    J'ai fait une classe qui crée des listes chaines, sachant que l'élément de chaque chaîne est un tableau de double.

    J'aurais pu utiliser des conteneurs, mais j'ai voulu refaire moi-même ma propre classe. Je vois juste qu'il manque le destructeur.

    Mais qu'en penses-vous?

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    class Tableau{
    private:
    	double *tab;
        Tableau *prec;
     
    public:
    	static long nblignes;
    	static Tableau* GetPrec(Tableau*); 
    	void SetPrec(Tableau*); 
    	Tableau(double);
    	static double *GetTab(Tableau*);
    	static void FilTab(Tableau*,long,double);
    };
     
    long Tableau::nblignes=0;
     
    Tableau::Tableau(double name){
    	//Constructeur
    	double *Ttab=new double[Max_size+1];
    	Ttab[0]=name;
    	for(long i=1;i<=Max_size;i++){
    		Ttab[i]=0;
    	}
    	this->tab=Ttab;
    }
     
    double* Tableau::GetTab(Tableau* rang){
    	 //permet d'obtenir la ligne correspondant au rang 
         return rang->tab;
    }
     
     
    void Tableau::SetPrec(Tableau* rang){
    	 //permet de fixer la ligne précédente
         this->prec=rang;
    }
    Tableau* Tableau::GetPrec(Tableau* rang){
    	 //permet d'obtenir la ligne précédente
         return rang->prec;
    }
    void Add_line(double name,Tableau **p){
         Tableau *new_elements=new Tableau(name);//Création de la nouvelle ligne
         (*p)->nblignes++;  
         new_elements->SetPrec(*p);
         *p=new_elements;
    }
     
    double* Get_line(double quote,Tableau *p){
                  //Cherche la ligne correspondant à la quotatio
    	while(Tableau::GetTab(p)[0]!=quote){
    		p=Tableau::GetPrec(p);
    	}
    	return Tableau::GetTab(p);
     
    }
    void Tableau::FilTab(Tableau *rang,long k,double value){
        //permet de remplir les cases du tableau correspondant a "rang"
    	rang->tab[k]=value;
    }
     
    int Tab_Exists(double name,Tableau *p){
    	 long i=0;double o=0;int res;
    	 Tableau *q=NULL;
    	 q=p;
    	 while((i<p->nblignes)&&(Tableau::GetTab(q)[0]==name)){ // q=p->prec;
    	     q=Tableau::GetPrec(p);
          	 i=i+1;
    	 }
    	 if(i<p->nblignes){
               res=1;}
    	 else
    	 {res=0;}
         return res;
    }
     double View(Tableau *p)
     {       double *u=Tableau::GetTab(p);
             return u[0];
     }
    J'ai d'ailleurs une question. Je comprends ce que sont les mots cléfs statique pour des variables, mais a quoi servent ils pour des fonctions?

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Tu utilises des mots clefs sans savoir à quoi ils servent?
    Sur une fonction membre ça permet d'appeller cette fonction sans avoir d'instances de la classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct foo{
         static void bar();
    };
     
    //..
     
    foo::bar();
    Sinon pour la liste chainée :
    En général ça se compose de deux structures : une maillon (contenant la donnée et un pointeur sur le maillon suivant) et la structure liste qui gère la collection de maillon .

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

    De plus, la sémantique qui "colle" à la notion de tableau est de présenter... un nombre donné d'éléments contigus en mémoire...

    Le corolaire de cela est que l'accès à un élément donné du tableau est sensé se faire en... temps constant (on parle aussi "d'accès aléatoire"):cela ne demande normalement pas plus de temps d'accéder au 100eme élément du tableau au départ du premier que d'accéder au deuxième.

    Or, une liste chainée propose un accès... séquentiel, c'est à dire, que pour passer du premier élément au centième, il faudra parcourir les 99 éléments qui les séparent, alors que, pour passer du premier au deuxième, il "suffira" de passer à l'élément suivant.

    Heuu... comprend tu l'aberration qu'il peut y avoir à représenter un tableau sous la forme d'une liste chainée, fusse-t-elle pondérée par le fait que chaque maillon permet de représenter un certains nombre d'éléments
    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

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    je vois ce que tu veux dire. En réalité, j'utilise un tableau dynamique qui doit ajouter des lignes en cours de route.
    Mais c'est clair que j'aurais pu faire plus simple. Mais cela m'a permis de réviser les classes!!

  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
    En fait, une classe Tableau aurait selon moi été proche de quelque chose comme
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    class Tableau
    {
        public:
            /* par défaut, on prévoit 10 éléments contigus 
             * ( c'est limite fixée de manière tout à fait arbitraire :D)
             */
            Tableau():size_(10), nextpos_(0), ptr_(new int[10]){}
            /* mais on laisse la possibilité à l'utilisateur d'en prévoir un
             * nombre différent
             */
            Tableau(size_t s):size_(s),nextpos_(0),ptr_(new int[s]){}
            /* le constructeur par copie */
            Tableau(Tableau const & rhs):size_(rhs.size_),nextpos_(rhs.nextpos_),
                   ptr_(new int[rhs.size_])
            {
                memcopy(ptr_,rhs.ptr_,size_);
            }
            /* et l'opérateur d'affectation Il utilise le fait que nous passons 
             * le tableau à affecter sous forme de valeur, ce qui implique, 
             * de facto la copie.
             * Le principe mis en oeuvre est le copy 'n swap ;)
             */
            Tableau & operator = (Tableau t)
            {
                std::swap(size_,t.size_);
                std::swap(nextpos_,t.nextpos_);
                std::swap(ptr_,t.ptr_);
                return *this;
            }
            ~Tableau()
            {
                delete[] ptr_;
                ptr_=0;
            }
            /* on permet à l'utilisateur d'ajouter un élément en fin de tableau 
             */
            void push_back(int i)
            {
                /* en doublant chaque fois la taille du tableau si nous avons
                 * atteint la limite des éléments possibles, nous évitons
                 * de devoir le refaire à chaque insertion
                 */
                if(nextpos_==size_)
                    resize(size_*2);
                ptr_[nextpos_]=i;
                ++nextpos_;
            }
            /* on permet à l'utilisateur de retirer le dernier élément du tableau 
             */
            void pop_back()
            {
                --nextpos_;
            }
            /* on pourrait aussi lui permettre d'en rajouter en début de tableau,
             * voire d'insérer un élément entre deux éléments existants...
             * Je ne présente pas ces fonctionnalités
             */
            /* on permet à l'utilisateur d'accéder à une valeur grace à
             * l'opérateur []
             * sous la forme non constante
             */
           int & operator[](size_t index){return ptr_[index];}
           /* et sous la forme constante */
           int const & operator[](size_t index){return ptr_[index];}
           /* La fonction at fournit la même possibilité, mais avec un controle
            * de l'index demandé (lance une exception "Overflow" à définir
            * si l'index est hors des limites admises
            */
           int & at(size_t index)
           {
               if(index>=nextpos_)
                   throw Overflow();
               return ptr_[index];
           }
           int const & at() const
           {
               if(index>=nextpos_)
                   throw Overflow();
               return ptr_[index];
           } 
           /* cette fonction permet de redimensionner le tableau */
           void resize(size_t newsize)
           {
               /* trois possibilités s'offrent à nous:
                *     - soit on rajoute des éléments potentiels,
                *     - soit on redimensionne afin d'en retirer
                *     - soit on ne change pas la taille
                */
               /* si on ne change pas la taille, on ne fait simplement rien */
               if(newsize!=size_)
               {
                   /* il nous faut un tableau temporaire à la bonne taille */
                   int * temp=new int[newsize];
                   /* si la nouvelle taille est plus grande que le nombre
                    * d'éléments présents, nous copions nextpos_ elements
                    * du tableau d'origine vers le tableau temporaire
                    * la position suivante reste inchangée
                    */
                   if(newsize>nexpos_)
                   {
                       memncpy(temp,ptr_,nextpos_*sizeof(int));
                   }
                   /* sinon, nous copions newsize éléments du tableau d'origine
                    * vers le tableau temporaire et
                    * la position suivante prend la valeur de newsize
                    */
                  else
                  {
                       memncpy(temp,ptr_,newsize*sizeof(int));
                       nextpos_=newsize;
                  }
                  /* on termine en libérant la mémoire allouée au tableau 
                   * d'origine
                   */
                 delete [] ptr_;
                 /* en définissant la nouvelle taille
                  */
                 size_=newsize;
                 /* et en assignant le tableau temporaire au pointeur réel
                  */
                 ptr_=temp;
               }
           }
        private:
            size_t size_; // le nombre maximal d'éléments potentiel à 
                          // un instant T
            size_t nextpos_; // la position du prochain élément
            int * ptr_; // le pointeur vers le tableau dont la mémoire est
                        // allouée dynamiquement
    };
    Ce n'est, défintivement, qu'un exemple écrit vite fait... il est très certainement améliorable et adaptable
    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
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    j'étudirai tous ca en détail.
    Une question me vient à l'esprit en voyant tout ca,
    pourquoi utiliser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      size_t size_; // le nombre maximal d'éléments potentiel à 
                          // un instant T
            size_t nextpos_; // la position du prochain élément
    et non pas par ex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     long size_; // le nombre maximal d'éléments potentiel à 
                          // un instant T
            long nextpos_; // la position du prochain élément
    Comme moi je l'aurais fait?

  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
    Parce que tant la position suivante que le nombre maximal d'éléments du tableau ne seront jamais que des valeurs numérique positives...

    Il ne sert donc à rien de permettre les valeurs négatives pour ces valeurs.

    Pire encore, l'utilisation de types (qu'il s'agisse de int ou de long) signés aurait, tôt ou tard, comme résultat de limiter le nombre d'éléments potentiels par rapport à l'utilisation d'un non signé de même type.

    En effet, comment voudrais tu arriver à une taille ou à une position équivalant à ... -10

    De plus, sauf erreur, size_t représente, quoi qu'il arrive, la taille maximale qu'un objet peut utiliser en mémoire (ce serait, toujours sauf erreur, l'abvréviation de "size type"), et correspond donc d'office au type adéquat en fonction de l'architecture et de l'implémentation du compilateur.

    Il n'est en effet pas impossible d'envisager une implémentation de compilateur sur une plateforme donnée dans laquelle size_t serait un unsigned int et une autre (sans doute sur une autre plateforme ou avec un autre OS) dans laquelle size_t serait un unsigned long, voire un unsigned long long...

    Si tu te base sur le fait que, pour l'implémentation du compilateur et l'architecture que tu utilise, la taille maximale est d'un type donné (par exemple unsigned int) et que tu fini, pour une raison quelconque, par compiler sur une architecture sur laquelle la taille maximale est unsigend long long, ou l'inverse, tu éprouvera des problèmes de compatibilité, soit du fait que tu "perd" la possibilité d'avoir un tableau contenant (beaucoup) plus d'éléments, soit, au contraire, parce que tu prévois qu'il pourra en contenir (beaucoup) plus que ce qu'il ne pourra réellement le faire...

    Si tu t'intéresse d'un peu plus près aux différents conteneurs de la STL, tu remarquera en effet que c'est systématiquement size_t qui est utilisé comme valeur de retour pour les fonctions size, length etc

    En utilisant size_t, tu profites "au mieux" des différentes macros placées dans cstddef ou stddef.h afin d'avoir la certitude que, quels que soient la plateforme, l'OS ou l'implémentation du compilateur, tu respectera les limitations "physiques" de la machine
    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

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Parce que tant la position suivante que le nombre maximal d'éléments du tableau ne seront jamais que des valeurs numérique positives..
    pour moi, la taille d'un tableau ne peut etre que positive.

    comment voudrais tu arriver à une taille ou à une position équivalant à ... -10
    Pourquoi voudrais-je arriver à une taille ou une position de -10 (je sais qu'avec Excel c'est possible,mais je peux faire en sorte de ne pas avoir à me retrouver dans ce cas avec le C++)

    Il n'est en effet pas impossible d'envisager une implémentation de compilateur sur une plateforme donnée dans laquelle size_t serait un unsigned int et une autre (sans doute sur une autre plateforme ou avec un autre OS) dans laquelle size_t serait un unsigned long, voire un unsigned long long...
    Comment savoir a quoi correspond size_t sur ma plateforme?

    Si tu t'intéresse d'un peu plus près aux différents conteneurs de la STL, tu remarquera en effet que c'est systématiquement size_t qui est utilisé comme valeur de retour pour les fonctions size, length etc
    je suis d'accord pour dire que la taille d'un tableau, ce n'est pas un nombre. C'est autre chose.

    C'est la qu'on voit la différence entre un bon et un mauvais codeur. Celui qui utilise pas size_t par ex.


    A l'avenir, il vaut mieux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t Taille=1000
    double *tab=new double[Taille]
    que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t Taille=1000
    double *tab=new double[Taille]

    Si on suppose que la taille est fixée, à 1000 par ex
    je suppose qu'il est carrément préférable de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t Taille=1000
    double *tab=new double[Taille]

    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double *tab=new double[1000]

    je suppose enfin que l'indice pour repérer un élément dans un tableau:
    doit etre de type size_t?

  9. #9
    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 deubelte Voir le message
    pour moi, la taille d'un tableau ne peut etre que positive.
    Si tu lis bien ma phrase, c'est ce que j'ai écrit
    Pourquoi voudrais-je arriver à une taille ou une position de -10 (je sais qu'avec Excel c'est possible,mais je peux faire en sorte de ne pas avoir à me retrouver dans ce cas avec le C++)
    Justement... En C++ une position -10 n'a aucun sens
    Comment savoir a quoi correspond size_t sur ma plateforme?
    tu peux savoir combien de bytes sont utilisés pour représenter une valeur de type size_t avec l'opérateur sizeof...

    Mais comme il y a des plateformes / implémentations pour lesquelles unsigned int, unsigned long et size_t font 4 bytes, comment savoir s'il s'agit d'un int ou d'un long

    Et, comme je te l'ai dit, size_t peut très bien, sur des plateformes 64 bits par exemple, faire 8 bytes...

    C'est la raison pour laquelle, si tu utilise size_t, tu as la certitude d'être dans le bon
    je suis d'accord pour dire que la taille d'un tableau, ce n'est pas un nombre. C'est autre chose.

    C'est la qu'on voit la différence entre un bon et un mauvais codeur. Celui qui utilise pas size_t par ex.
    C'est peut être un peu exagéré, mais ca peut être un indice
    A l'avenir, il vaut mieux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t Taille=1000
    double *tab=new double[Taille]
    que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t Taille=1000
    double *tab=new double[Taille]
    Heuu... quelle est la différence
    Si on suppose que la taille est fixée, à 1000 par ex
    je suppose qu'il est carrément préférable de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    size_t Taille=1000
    double *tab=new double[Taille]

    à

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double *tab=new double[1000]
    Généralement, il est préférable d'éviter les "valeurs magiques" (celles qui sont écrites en dur et dont on ne sait absolument pas d'où elles viennent)...

    Surtout si cette valeur apparait régulièrement.

    En effet, si tu fixe "arbitrairement" la valeur à 1000, et que, par la suite, tu te rend compte qu'il faut la faire passer à 1500 (ou à 750), le fait d'avoir utilisé une variable ou une constante particulière te permet, en ne modifiant que la valeur de cette variable ou constante, de faire en sorte que la modification soit prise en compte partout, alors qu'autrement, tu devrait rechercher la valeur dans l'ensemble de ton projet et déterminer au coup par coup si il faut la changer...
    je suppose enfin que l'indice pour repérer un élément dans un tableau:
    doit etre de type size_t?
    Idéalement, oui...

    Tu peux, bien sur, tirer parti de la possibilité qui existe de conversion implicite entre un int et un unsigned int, mais, si tu règle correctement ton compilateur, il t'avertira que tu tente d'utiliser un non signé à la place d'un signé (c'est encore plus flagrant lorsque tu essaye de comparer un indice i à la taille ou à la position renvoyée par une fonction membre de ta classe)...

    Autant éviter ce genre d'avertissement en choisissant, d'office, le type de valeur adéquat
    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

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Heuu... quelle est la différence
    Pardon, je voulais dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double Taille=1000;
    double *tab=new double[Taille];
    que:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    size_t Taille=1000;
    double *tab=new double[Taille];

  11. #11
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    un double pour une taille n'a pas de sens :s. A la rigueur un int, mieux un unsigned int mais pas un floattant.

  12. #12
    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
    Ah, oui... effectivement, c'est préférable...

    Et, surtout, il ne faut pas utiliser des... réels pour représenter la taille...

    S'il peut être envisagé d'utiliser des entiers (signés ou non), les réels (float ou double) sont encore moins conseillés que les entiers

    [EDIT]Grilled...
    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

  13. #13
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Si on reprend l'analyse de la classe, on a :
    3 constructeurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tableau():
    Tableau(size_t s):
    Tableau(Tableau const & rhs)
    1 destructeurs: une redéfinition d'un opérateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tableau & operator =
    int & operator[]
    int const & operator[]
    trois fonctions membre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void push_back(int i)
    void pop_back()
    void resize()
    une fonction qui renvoie une ref: Dans le premier constructeur, on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau():size_(10), nextpos_(0), ptr_(new int[10]){}
    Cela revient a faire, il me semble qqch comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Tableau(){
    size_=10;
    nextpos_=0;
    ptr_=new int[10];
    }
    mise a part que ca fait mieux , quelle est la différence entre les deux?

    Enfin, dans private:
    on a:
    N'est il pas nécessaire de faire:
    comme je l'aurais fait?

  14. #14
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par deubelte Voir le message
    Dans le premier constructeur, on a:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tableau():size_(10), nextpos_(0), ptr_(new int[10]){}
    Cela revient a faire, il me semble qqch comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Tableau(){
    size_=10;
    nextpos_=0;
    ptr_=new int[10];
    }
    Oui

    Citation Envoyé par deubelte Voir le message
    mise a part que ca fait mieux , quelle est la différence entre les deux?
    http://cpp.developpez.com/faq/cpp/in...EUR_liste_init

    Citation Envoyé par deubelte Voir le message
    Enfin, dans private:
    on a:
    N'est il pas nécessaire de faire:
    comme je l'aurais fait?
    Tu peux pas faire ça..

  15. #15
    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 deubelte Voir le message
    une redéfinition d'un opérateur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Tableau & operator =
    int & operator[]
    int const & operator[]
    à ceci près que c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const & operator [] const
    pour le dernier que tu as repris...

    Le const final indique que la fonction (l'opérateur ici) s'engage à ne pas modifier l'objet au départ duquel elle est appelée, ce qui permet d'appeler la fonction même (et surtout) sur un objet qui serait déclaré constant.

    Cela implique que l'opérateur
    qui peut être appelé sur un tableau non constant permet une écriture proche de
    afin de modifier la valeur de l'élément se trouvant à l'indice index, alors que l'opérateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int const & operator[] const
    l'interdira: le tableau est constant, et ne peut donc pas être modifié, et l'élément se trouvant à l'indice index sera... lui aussi constant et ne pourra donc, fatalement, pas être modifié non plus
    une fonction qui renvoie une ref:
    En fait, ce sont deux fonctions qui renvoient une référence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int & at 
    int const & at const
    La première permet éventuellement de modifier la valeur de l'élément (vu qu'il est renvoyé par référence non constante) alors que la seconde s'engage à ce que ce ne soit jamais fait (cf ma remarque précédente).

    Mais le plus important n'est pas le fait qu'elles renvoient des références, le plus important est qu'elles présentent un comportement similaire à l'opérateur [] avec le "petit plus" d'une vérification de la validité de l'indice donné...
    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

  16. #16
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    j'ai une question sur les fonctions qui renvoient des références. Si on fait par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int & f(int a){
      return a         
    }
     
    void main(){
    int u=2;
    int a=f(u);
    }
    on est d'accord que f renvoie une référence. Que sera alors la valeur de a?
    Quelle type de variable sera a?
    J'ai essayé ce programme, et "a" a une valeur de 2. Telle que je la comprends, cette fonction devrait renvoyer la référence de la variable u.
    Non?
    Merci

  17. #17
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Indéfini : ici tu renvoies une référence vers un objet qui est détruit lorsque tu sors de la fonction. C'est très déconseillé.

    Si tu as un type comme int alors autant y aller par copie, tu n'y perdras rien.
    Si tu as un type plus complexe, peut être qu'une allocation dynamique sera plus adequate si tu veux que la vie de l'objet soit plus longue que la durée de la fonction -- aidé d'un smart pointer.

    Par contre tu peux faire quelque chose comme ça sans souci, si c'est adequate a ton cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int & increment(int& a){
      return a++;
    }

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 21
    Par défaut
    J'ai vue ça quelque part... ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef unsigned int size_t

  19. #19
    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 3uclide Voir le message
    J'ai vue ça quelque part... ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef unsigned int size_t
    Ca peut être ca, ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef unsigned long long size_t
    Ou encore... va savoir (tant que c'est non signé et entier)...selon l'architecture
    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

Discussions similaires

  1. que pensez-vous de ma classe?
    Par noctua dans le forum C++
    Réponses: 4
    Dernier message: 18/08/2011, 21h37
  2. que pensez vous de ma classe Matrice?
    Par deubelte dans le forum C++
    Réponses: 9
    Dernier message: 29/05/2008, 15h16
  3. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 11h17
  4. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 16h45
  5. Que pensez vous du mariage ASP Flash?
    Par tyma dans le forum Flash
    Réponses: 4
    Dernier message: 09/07/2003, 16h00

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