Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Classe "implicite" d'un itérateur

24 réponses
Avatar
Dominique MICOLLET
Bonjour

J'ai un doute dans ma compréhension de la déclaration d'un itérateur dans la
situation suivante :

class A : public vector <B>
{
......
void C();
}

void A:C()
{
....
const_iterator I=begin(); //cbegin() en C++11
.....
}

Suis-je dans l'erreur en considérant que I est implicitement déclaré comme
A::const_iterator I et qu'il équivaut à un vector<B>::const_iterator ?

Cordialement
Dominique

10 réponses

1 2 3
Avatar
Lucas Levrel
Le 4 mars 2015, Dominique MICOLLET a écrit :

class A : public vector <B>
{
......
void C();
}

void A:C()
{
....
const_iterator I¾gin(); //cbegin() en C++11
.....
}

Suis-je dans l'erreur en considérant que I est implicitement déclaré comme
A::const_iterator I et qu'il équivaut à un vector<B>::const_iterator ?



Vive « auto » !

--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
Avatar
Dominique MICOLLET
Bonjour,

Lucas Levrel wrote:
Vive « auto » !




Argh.... Moi qui enseigne à mes étudiants qu'il ne faut jamais laisser la
machine décider à votre place, je ne peux m'autoriser à user de ce mot-clef
dont j'ignorais jusqu'à l'existence. Pourquoi ne pas utiliser Windows tant
qu'à faire. :-)

Plus sérieusement, merci pour cette suggestion. Mais je cherche surtout à
comprendre ce que j'écris. Je suis phase d'apprentissage du C++.

Cordialement

Dominique.
Avatar
espie
In article <54f80015$0$3192$,
Dominique MICOLLET wrote:
Bonjour,

Lucas Levrel wrote:
Vive « auto » !




Argh.... Moi qui enseigne à mes étudiants qu'il ne faut jamais laisser la
machine décider à votre place, je ne peux m'autoriser à user de ce mot-clef



La machine ne decide rien a ta place, hein. C'est bien toi qui a ecrit
la valeur d'initialisation. Elle se coltine juste un calcul (de type) a
ta place. C'est son boulot, non ?

Perso, je considere qu'il faut mettre auto presque partout ou c'est
possible. Deja parce que std::vector<int>::const_iterator, c'est de
nature a faire fuir le debutant (et le moins debutant), mais surtout
parce que ca evite de faire des coercions de valeur sans faire expres.

Genre, je prefere infiniment

auto d = 5.2;
a
float d = 5.2;
Avatar
Dominique MICOLLET
Bonjour,

Marc Espie wrote:
Genre, je prefere infiniment

auto d = 5.2;
a
float d = 5.2;



Certes. Mais si je veux un double ? ou un long double ? ou un long long
double ?
Je débute en C++, mais j'ai une longue expérience tant en production qu'en
pédagogie des loufoqueries induites par les "valeurs par défaut" en
informatique.

Je considère que se poser la question "quel est le type de cette variable"
est un moyen d'éviter des pièges.

Mais on est là dans le débat d'opinion et je conçois que d'autres aient une
perception et une expérience différentes.

Cordialement

Dominique
Avatar
Lucas Levrel
Le 5 mars 2015, Dominique MICOLLET a écrit :

Lucas Levrel wrote:
Vive « auto » !



Argh.... Moi qui enseigne à mes étudiants qu'il ne faut jamais laisser la
machine décider à votre place, je ne peux m'autoriser à user de ce mot-clef
dont j'ignorais jusqu'à l'existence.



C'est du C++11.

Plus sérieusement, merci pour cette suggestion. Mais je cherche surtout à
comprendre ce que j'écris. Je suis phase d'apprentissage du C++.



Je l'utilise uniquement pour des itérateurs ou des trucs similaires
(valeur de retour d'une fonction membre d'une classe de la STL), parce que
je trouve leur type très indigeste, et faire un typedef juste pour un
itérateur...

Dans ce cas précis je trouve que ça clarifie le code et ne risque pas
d'introduire des erreurs.

Note que je ne suis pas informaticien. J'utilise le C++ un peu comme du «
C with classes », et j'apprends sur le tas (donc sans doute un peu de
travers). Du coup j'ai un point de vue plutôt pragmatique !

Un site que je trouve très utile, notamment pour sa « Standard C++ Library
reference » : www.cplusplus.com

--
LL
Ἕν οἶδα ὅτι οὐδὲν οἶδα (Σωκράτης)
Avatar
Jean-Marc Bourguet
Dominique MICOLLET writes:

Bonjour

J'ai un doute dans ma compréhension de la déclaration d'un it érateur dans la
situation suivante :

class A : public vector <B>
{
......
void C();
}

void A:C()
{
....
const_iterator Igin(); //cbegin() en C++11
.....
}

Suis-je dans l'erreur en considérant que I est implicitement dé claré comme
A::const_iterator I et qu'il équivaut à un vector<B>::const_ite rator ?



Plus précisément I est explicitement déclaré comme à ©tant du type const_iterator trouvé
par une recherche dans le contexte courant. On va chercher dans A::C(),
il n'y a probablement rien, on va chercher dans A, il n'y a probablement
rien, on va chercher dans vector<B>, il y a probablement quelque chose.

Considérer qu'il y a un const_iterator déclaré implicitement déclaré
dans A fonctionne assez bien, mais décrit aussi peu la réalità ©
que de considérer qu'il y en a un implicitement déclaré dans A::C. Ça
fonctionne jusqu'au moment où on se trouve dans un cas où la rech erche
s'arrête plus tôt (dans les templates par exemple), et celui qui a ce
modèle dans la tête ne comprend plus ce qui se passe.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Jean-Marc Bourguet
Dominique MICOLLET writes:

Bonjour,

Lucas Levrel wrote:
Vive « auto » !




Argh.... Moi qui enseigne à mes étudiants qu'il ne faut jamais laisser la
machine décider à votre place, je ne peux m'autoriser à us er de ce mot-clef
dont j'ignorais jusqu'à l'existence.



Entre auto et hériter publiquement d'une classe comme vector<> qui n'a
pas été conçue pour, je sais ce que je préfèrerais qu'on enseigne à ceux
qui voudraient devenir mes collègues. ;-)

Craindre auto me fait penser aux programmeurs C qui craignent les
paramètres références non constantes.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index. html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
Dominique MICOLLET
Bonjour,

Lucas Levrel wrote:
Note que je ne suis pas informaticien. J'utilise le C++ un peu comme du «
C with classes », et j'apprends sur le tas (donc sans doute un peu de
travers). Du coup j'ai un point de vue plutôt pragmatique !



Yo Brother :-)

Je suis dans la même situation. Toutefois je percois de plus en plus que je
passe à coté de fonctionnalités puissantes du C++ et qu'il faut que je
comprenne mieux comment tout cela s'articule. Quelque part, je n'apprécie
pas que ce soit la machine qui me domine :-).

Un site que je trouve très utile, notamment pour sa « Standard C++ Library
reference » : www.cplusplus.com



Je m'en sert effectivement très souvent.

Par ailleurs, je "potasse" en ce moment :
http://www.icce.rug.nl/documents/cplusplus/
C'est un cours dont le début est très prometteur.

Cordialement

Dominique
Avatar
Dominique MICOLLET
Bonjour,

Jean-Marc Bourguet wrote:

Entre auto et hériter publiquement d'une classe comme vector<> qui n'a
pas été conçue pour, je sais ce que je préfèrerais qu'on enseigne à ceux
qui voudraient devenir mes collègues. ;-)



Rassurez-vous, je n'enseigne pas le C++ :-).

Plus sérieusement, pourriez-vous développer votre réticence quant à
l'héritage public de vector ?

Craindre auto me fait penser aux programmeurs C qui craignent les
paramètres références non constantes.



Je n'ai pas compris.

Cordialement

Dominique.
Avatar
Dominique MICOLLET
Bonjour,

Jean-Marc Bourguet wrote:
Plus précisément I est explicitement déclaré comme étant du type
const_iterator trouvé
par une recherche dans le contexte courant. On va chercher dans A::C(),
il n'y a probablement rien, on va chercher dans A, il n'y a probablement
rien, on va chercher dans vector<B>, il y a probablement quelque chose.



C'est bien comme cela que je le préssentais.


Considérer qu'il y a un const_iterator déclaré implicitement déclaré
dans A fonctionne assez bien, mais décrit aussi peu la réalité
que de considérer qu'il y en a un implicitement déclaré dans A::C. Ça
fonctionne jusqu'au moment où on se trouve dans un cas où la recherche
s'arrête plus tôt (dans les templates par exemple), et celui qui a ce
modèle dans la tête ne comprend plus ce qui se passe.



Je ne comprends pas votre remarque.

Le type const_iterator n'est pas défini dans A::C : le compilateur est bien
obligé de remonter la hierarchie jusqu'à en trouver un, et il me semble que
la norme en propose un dans "vector". J'ignore bien sûr s'il est dans
"vector" ou encore plus loin dans la hiérarchie, mais il me semble que ce
n'est pas important, puisque je veux un itérateur capable de parcourir le
"vector".

Cordialement

Dominique
1 2 3