Fonction const qui ne modifie pas la structur de donnée mais....
4 réponses
PRORIOL Fabien
Bonsoir,
J'ai un petit problème;
En gros j'ai une classe qui contient une liste chainé d'element.
Elle contient comme attribut un pointeur sur le premier element de la liste,
et un pointeur qui me sert d'Iterateur pour un parcour de la liste.
J'ai une methode InitPtr qui initialise l'iterateur au premier element et
une methode pLire() qui retourne une copie de l'element puis fait pointer
l'Iterateur sur l'element suivant.
J'aimerais pouvoir definir les methode pLire et InitPtr comme "const" étant
donnée qu'elle ne modifie en rien la structure de donnée de la classe;
Mais comme elle modifie un attribut, ce n'est pas possible.
Que puis-je employer comme solution; existe-t-il une methode permettant de
resoudre mon pb (mettre l'iterateur comme membre static de la fonction
pLire, mais alors comment l'initialiser....).
Si vous avez une solution a mon probleme, merci d'avance
@+Fab
Ajoute 'mutable' devant la déclaration de l'itérateur. Tes fonctions membres const pourront alors le modifier sans que le compilateur se plaigne.
kanze
"PRORIOL Fabien" <c4<nospam>@<nospam>saint-pal.com> wrote in message news:<4119024a$0$22920$...
J'ai un petit problème;
En gros j'ai une classe qui contient une liste chainé d'element. Elle contient comme attribut un pointeur sur le premier element de la liste, et un pointeur qui me sert d'Iterateur pour un parcour de la liste.
J'ai une methode InitPtr qui initialise l'iterateur au premier element et une methode pLire() qui retourne une copie de l'element puis fait pointer l'Iterateur sur l'element suivant.
J'aimerais pouvoir definir les methode pLire et InitPtr comme "const" étant donnée qu'elle ne modifie en rien la structure de donnée de la classe; Mais comme elle modifie un attribut, ce n'est pas possible.
Non seulement elles modifient un attribut, elles modifient l'état visible. Elle ne doivent donc pas être const.
Que puis-je employer comme solution; existe-t-il une methode permettant de resoudre mon pb (mettre l'iterateur comme membre static de la fonction pLire, mais alors comment l'initialiser....).
Le véritable problème, c'est que ton objet maintient deux états distincts : le contenu de la liste, et la position de l'itérateur. Du coup, indépendamment du problème évident de ne permettre qu'une seule itération sur la liste à la fois, il pose le problème de const.
La solution évidente, c'est d'en faire deux classes : la liste, et l'itérateur.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
"PRORIOL Fabien" <c4<nospam>@<nospam>saint-pal.com> wrote in message
news:<4119024a$0$22920$636a15ce@news.free.fr>...
J'ai un petit problème;
En gros j'ai une classe qui contient une liste chainé d'element. Elle
contient comme attribut un pointeur sur le premier element de la
liste, et un pointeur qui me sert d'Iterateur pour un parcour de la
liste.
J'ai une methode InitPtr qui initialise l'iterateur au premier element
et une methode pLire() qui retourne une copie de l'element puis fait
pointer l'Iterateur sur l'element suivant.
J'aimerais pouvoir definir les methode pLire et InitPtr comme "const"
étant donnée qu'elle ne modifie en rien la structure de donnée de la
classe; Mais comme elle modifie un attribut, ce n'est pas possible.
Non seulement elles modifient un attribut, elles modifient l'état
visible. Elle ne doivent donc pas être const.
Que puis-je employer comme solution; existe-t-il une methode
permettant de resoudre mon pb (mettre l'iterateur comme membre static
de la fonction pLire, mais alors comment l'initialiser....).
Le véritable problème, c'est que ton objet maintient deux états
distincts : le contenu de la liste, et la position de l'itérateur. Du
coup, indépendamment du problème évident de ne permettre qu'une seule
itération sur la liste à la fois, il pose le problème de const.
La solution évidente, c'est d'en faire deux classes : la liste, et
l'itérateur.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
"PRORIOL Fabien" <c4<nospam>@<nospam>saint-pal.com> wrote in message news:<4119024a$0$22920$...
J'ai un petit problème;
En gros j'ai une classe qui contient une liste chainé d'element. Elle contient comme attribut un pointeur sur le premier element de la liste, et un pointeur qui me sert d'Iterateur pour un parcour de la liste.
J'ai une methode InitPtr qui initialise l'iterateur au premier element et une methode pLire() qui retourne une copie de l'element puis fait pointer l'Iterateur sur l'element suivant.
J'aimerais pouvoir definir les methode pLire et InitPtr comme "const" étant donnée qu'elle ne modifie en rien la structure de donnée de la classe; Mais comme elle modifie un attribut, ce n'est pas possible.
Non seulement elles modifient un attribut, elles modifient l'état visible. Elle ne doivent donc pas être const.
Que puis-je employer comme solution; existe-t-il une methode permettant de resoudre mon pb (mettre l'iterateur comme membre static de la fonction pLire, mais alors comment l'initialiser....).
Le véritable problème, c'est que ton objet maintient deux états distincts : le contenu de la liste, et la position de l'itérateur. Du coup, indépendamment du problème évident de ne permettre qu'une seule itération sur la liste à la fois, il pose le problème de const.
La solution évidente, c'est d'en faire deux classes : la liste, et l'itérateur.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
En gros j'ai une classe qui contient une liste chainé d'element. Elle contient comme attribut un pointeur sur le premier element de la liste, et un pointeur qui me sert d'Iterateur pour un parcour de la liste.
J'ai une methode InitPtr qui initialise l'iterateur au premier element et une methode pLire() qui retourne une copie de l'element puis fait pointer l'Iterateur sur l'element suivant.
J'aimerais pouvoir definir les methode pLire et InitPtr comme "const" étant donnée qu'elle ne modifie en rien la structure de donnée de la classe; Mais comme elle modifie un attribut, ce n'est pas possible.
Que puis-je employer comme solution; existe-t-il une methode permettant de resoudre mon pb (mettre l'iterateur comme membre static de la fonction pLire, mais alors comment l'initialiser....).
Si vous avez une solution a mon probleme, merci d'avance
Regarde "mutable" et si le sujet t'interesse cherche "logical constness" et "physical constness".
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
En gros j'ai une classe qui contient une liste chainé d'element.
Elle contient comme attribut un pointeur sur le premier element de la liste,
et un pointeur qui me sert d'Iterateur pour un parcour de la liste.
J'ai une methode InitPtr qui initialise l'iterateur au premier element et
une methode pLire() qui retourne une copie de l'element puis fait pointer
l'Iterateur sur l'element suivant.
J'aimerais pouvoir definir les methode pLire et InitPtr comme "const" étant
donnée qu'elle ne modifie en rien la structure de donnée de la classe;
Mais comme elle modifie un attribut, ce n'est pas possible.
Que puis-je employer comme solution; existe-t-il une methode permettant de
resoudre mon pb (mettre l'iterateur comme membre static de la fonction
pLire, mais alors comment l'initialiser....).
Si vous avez une solution a mon probleme, merci d'avance
Regarde "mutable" et si le sujet t'interesse cherche "logical
constness" et "physical constness".
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
En gros j'ai une classe qui contient une liste chainé d'element. Elle contient comme attribut un pointeur sur le premier element de la liste, et un pointeur qui me sert d'Iterateur pour un parcour de la liste.
J'ai une methode InitPtr qui initialise l'iterateur au premier element et une methode pLire() qui retourne une copie de l'element puis fait pointer l'Iterateur sur l'element suivant.
J'aimerais pouvoir definir les methode pLire et InitPtr comme "const" étant donnée qu'elle ne modifie en rien la structure de donnée de la classe; Mais comme elle modifie un attribut, ce n'est pas possible.
Que puis-je employer comme solution; existe-t-il une methode permettant de resoudre mon pb (mettre l'iterateur comme membre static de la fonction pLire, mais alors comment l'initialiser....).
Si vous avez une solution a mon probleme, merci d'avance
Regarde "mutable" et si le sujet t'interesse cherche "logical constness" et "physical constness".
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
PRORIOL Fabien
Merci beaucoup, C'est exactement ce que je recherché. Comme je n'avais jamais utilisé de tel variable, j'avais totalement oublié le mot clé "mutable" ;-)
Merci beaucoup
Ajoute 'mutable' devant la déclaration de l'itérateur. Tes fonctions membres
const pourront alors le modifier sans que le compilateur se plaigne.
Merci beaucoup,
C'est exactement ce que je recherché.
Comme je n'avais jamais utilisé de tel variable, j'avais totalement oublié
le mot clé "mutable" ;-)
Merci beaucoup
Ajoute 'mutable' devant la déclaration de l'itérateur. Tes fonctions
membres
const pourront alors le modifier sans que le compilateur se plaigne.
Merci beaucoup, C'est exactement ce que je recherché. Comme je n'avais jamais utilisé de tel variable, j'avais totalement oublié le mot clé "mutable" ;-)
Merci beaucoup
Ajoute 'mutable' devant la déclaration de l'itérateur. Tes fonctions membres
const pourront alors le modifier sans que le compilateur se plaigne.