Bonjour
Quelqu'un peut me rappeler la différence entre ces déclarations :
ça fait logntemps que je n'ai pas travailler avec c++ 8OCode:
1
2
3
4 vector <objet> A vector <objet> *A vector <objet> **A
Version imprimable
Bonjour
Quelqu'un peut me rappeler la différence entre ces déclarations :
ça fait logntemps que je n'ai pas travailler avec c++ 8OCode:
1
2
3
4 vector <objet> A vector <objet> *A vector <objet> **A
T'en fait pas, la seule que tu ais à connaître c'est :
Code:
1
2 vector <objet> A
Sinon
type * A c'est un pointeur
type ** A c'est équivalent à un tableau de pointeurs
Et sinon en C++:
" cont Type & A " ça te parle?
Merci Nikko
Mais si je veux un vector de vector<objet> ?
NON !:roll:Citation:
Et sinon en C++:
" cont Type & A " ça te parle?
Sinon regarde dans la FAQ les références, les const etc, c'est importantCode:
1
2 std::vector< std::vector < object > >
Salut,Si ce n'est que, dans le code présenté, le type de A est déjà... un vector (que je vais considérer, à défaut de plus de précision comme étant... std::vector)...
De ce fait
Sachant que la gestion de pointeurs (ou de pointeurs de pointeurs) est souvent associée à la gestion dynamique de la mémoire, on aurait tendance à dire que
- vector<objet> A est... un tableau d'objets
- vector<objet> * A est un pointeur sur un tableau d'objets
- vector<objet> ** est un pointeur de pointeur sur un tableau d'objet
Sauf que...
- vector<objet> * A aurait pour but de permettre l'allocation dynamique de mémoire pour tableau (C style) de tableaux d'objets
- vector<objet> ** A aurait pour but de permettre l'allocation dynamique de mémoire pour un tableau (C style) à deux dimensions de tableaux d'objets
De manière générale, il n'est vraiment pas bon de manipuler des pointeurs sur les collections fournies par le standard.
En effet, std::vector fournit une interface capable de rendre tous les services rendus par un tableau "C style" tout en évitant, justement, d'avoir à recourir à la gestion a mano de la mémoire nécessaire pour représenter les différents éléments de ce tableau
Vouloir gérer a mano un tableau de tableau d'éléments (qui pourrait donc passer pour un tableau à deux dimensions de ces élément) revient à... s'apprêter à se tirer une balle dans le pied, et c'est encore pis si l'idée est... d'essayer de gérer a mano un tabeaux deux dimensions de ce tableau d'éléments (qui passerait donc pour un... tableau à trois dimensions d'éléments)
Ceci est valide lorsque l'on se place du point de vue d'une déclaration de variable ;)
Maintenant, en C, les pointeurs (et les pointeurs de pointeurs) sont souvent utilsés afin de permettre à une fonction de modifier un argument qui leur est passé, l'appel de la fonction se faisant en transmettant "l'adresse de l'objet" servant d'argument.
De manière générale, l'utilisation de l'opérateur "address of" afin de passer un argument modifiable à une fonction est une pratique qu'il vaut mieux éviter en C++ au profit de l'utilisation des références, qui peuvent être constantes si le but est "simplement" d'éviter la copie de l'objet passé en argument.
En effet, les références présentent un certain nombre d'avantages par rapport aux pointeurs, dont, entre autres, la garantie de non nullité:
Si un argument est une référence sur un objet, l'objet en question doit d'office exister.
Si un argument est une référence constante sur un objet, nous pouvons, au mieux, et sous certaines conditions, utiliser une variable temporaire non nommée créée spécialement à l'occasion de l'appel de la fonction
Au final, je crois que l'on peut dire que, si tu rencontre une de ces trois lignes dans un code C++, tu es largement en droit de te montrer prudent, pour ne pas dire inquièt, quant au but recherché par le code (c'est pire encore s'il apparait dans un cours ou un tutorial ;))
Merci beaucoup koala01 :ccool: