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

appel de fonction membre

2 réponses
Avatar
Jean-Noël Mégoz
Qu'elle est dure, la loi du compilo ! ;)

Vu que je me suis enfin lancé dans une appli pratique en C++, je risque de
venir vous déranger assez souvent dans l'avenir immédiat...
Voici, donc, ma question du jour :

int* Matrix::GetClosure() const
{
if (closure == 0) CalcClosure();

int* buff = new int[dim*dim];
memcpy(buff, closure, dim*dim*sizeof(int));

return buff;
}

Je veux calculer la fermeture transitive d'une matrice et stocker le
résultat pour ne pas avoir à refaire le calcul lors d'un second appel. Mon
idée est donc d'initialiser dans mon instance de Matrix, un pointeur
'closure' à 0.
La fonction GetClosure étant 'const', elle ne modifie pas ce pointeur :
c'est la fonction CalcClosure qui le fait, après avoir créé le tableau de
nombres voulu (la méthodologie est peut-être discutable, comme toute
méthodologie, mais ma question ne porte pas sur ce point...).

Là où le bât blesse, c'est que le compilateur tique sur la ligne 'if...' et
m'envoie le message :
error C2662: 'CalcClosure' : cannot convert 'this' pointer from 'const class
Matrix' to 'class Matrix &'

Je ne comprends pas cette erreur. Pourquoi ne puis-je appeler la fonction
membre CalcClosure, alors que faire référence au membre 'dim' 2 lignes en
dessous ne pose aucun problème ?!

2 réponses

Avatar
Jean-Marc Bourguet
"Jean-Noël Mégoz" writes:

Je ne comprends pas cette erreur. Pourquoi ne puis-je appeler la fonction
membre CalcClosure, alors que faire référence au membre 'dim' 2 lignes en
dessous ne pose aucun problème ?!


Parce que CalcClosure n'est pas const mais GetClosure l'est et ne peux
donc que lire des membres et appeler des membres const.

Solution, rendre closure mutable (mettre mutable devant sa
declaration) et GetClosure const. Les membres mutables sont concus
justement pour ce probleme: permettre de garder const des fonctions
membres qui le sont logiquement mais modifient un membre pour des
raisons diverses.

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-Noël Mégoz
"Jean-Marc Bourguet" a écrit dans le message de
news:
"Jean-Noël Mégoz" writes:

Parce que CalcClosure n'est pas const mais GetClosure l'est et ne peux
donc que lire des membres et appeler des membres const.

Ok, c'est la nécessité d'appeler des membres const qui m'avait échappé.

Merci.