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

Acces à un vecteur en "lecture seule"

11 réponses
Avatar
Zoubidaman
Bonjour,

on m'a appris un jour à donner accès à des membres d'une classe (ici un
vecteur) de la sorte:

struct toto
{
private:
typedef vector<int> test;
test foo;
public:
const test & Vect () const { return this->foo; }
test & Vect () { return this->foo; }
};

Ici on a accès au vecteur foo aussi bien en "écriture" (push_back par ex.)
qu'en "lecture" (obtenir un élément, la taille du vecteur...)

Je voulais savoir s'il était possible d'empêcher la modification de ce
vecteur depuis une autre classe?

Merci d'avance

10 réponses

1 2
Avatar
Loïc Joly
Zoubidaman wrote:
Bonjour,

on m'a appris un jour à donner accès à des membres d'une classe (ici un
vecteur) de la sorte:

struct toto
{
private:
typedef vector<int> test;
test foo;
public:
const test & Vect () const { return this->foo; }
test & Vect () { return this->foo; }
};

Ici on a accès au vecteur foo aussi bien en "écriture" (push_back par ex.)
qu'en "lecture" (obtenir un élément, la taille du vecteur...)

Je voulais savoir s'il était possible d'empêcher la modification de ce
vecteur depuis une autre classe?


Je ne suis pas certain de bien comprendre la question, mais si c'est le
cas, simplement supprimer
toto::test & toto::Vect ()
devrait faire ce que tu demandes.

--
Loïc

Avatar
Zoubidaman
Loïc Joly wrote in
news:bg74om$ib5$:

Je ne suis pas certain de bien comprendre la question, mais si c'est
le cas, simplement supprimer
toto::test & toto::Vect ()
devrait faire ce que tu demandes.



Ce que je veux, c'est empêcher des modifications et des ajouts de valeur
en dehors de la classe...

Je testerai ton code demain, parce que là dodo

Merci!!

Avatar
Loïc Joly
Fabien LE LEZ wrote:

private:
// "private" signifie "privé". Seul l'implémentateur de la
classe devrait pouvoir lire le contenu de cette partie.


Une autre utilisation importante de private est pour les fonctions
virtuelles que l'utilisateur de la classe n'a pas le droit d'appeler
directement, que celui qui dérive de la classe ne peut pas non plus
appeller directement, mais qu'il doit surcharger pour que sa dérivation
marche.

C'est particulièrement utile pour mettre en place la programmation par
contrat.

C'est ce qui fait dire à certains que les fonction publiques devraient
toutes être non virtuelles, et les fonctions virtuelles devraient être
private par défaut, protected dans certains cas particuliers.

--
Loïc

Avatar
Zoubidaman
Voici pourquoi je vous pose la question:

j'ai créé une classe (appellons la DATA) qui conserve en mémoire dans des
maps les informations d'un fichier XML.

Le constructeur de la classe se chargeant de "remplir" les maps avec les
données du fichier.

Ensuite dans d'autres classes j'ai besoin d'utiliser les valeurs contenues
dans les maps de la classe DATA, donc il faut que je puisse accéder aux
maps, ce que je fais, par exemple, grâce à ces deux fonctions:

const ToutesActions & m_ToutesActions () const { return this->TA; }
ToutesActions & m_ToutesActions () { return this->TA; }

Comme ça ça marche très bien. Mais pour être sûr de ne pas faire de
bétises, je voudrais empêcher la possibilité de modifier la map depuis une
autre classe, donc autoriser uniquement la lecture des maps grâce aux
iterateurs ou grâce à toto = map[cle].

Mais apparement même avec les const ça change rien, je peux faire des
push_back...

Je peux faire comment alors?
Avatar
Christophe Lephay
"Zoubidaman" a écrit dans le message de
news:
Voici pourquoi je vous pose la question:

j'ai créé une classe (appellons la DATA) qui conserve en mémoire dans des
maps les informations d'un fichier XML.

Le constructeur de la classe se chargeant de "remplir" les maps avec les
données du fichier.

Ensuite dans d'autres classes j'ai besoin d'utiliser les valeurs contenues
dans les maps de la classe DATA, donc il faut que je puisse accéder aux
maps, ce que je fais, par exemple, grâce à ces deux fonctions:

const ToutesActions & m_ToutesActions () const { return this->TA; }
ToutesActions & m_ToutesActions () { return this->TA; }

Comme ça ça marche très bien. Mais pour être sûr de ne pas faire de
bétises, je voudrais empêcher la possibilité de modifier la map depuis une
autre classe, donc autoriser uniquement la lecture des maps grâce aux
iterateurs ou grâce à toto = map[cle].

Mais apparement même avec les const ça change rien, je peux faire des
push_back...


Il faut fournir dans ta classe un moyen d'accéder aux éléments de ton map de
manière individuelle au lieu de fournir un accès à l'ensemble de ton map.

Chris

Avatar
Zoubidaman
OK, c'est ce que je comptais faire de toute façon...

Néanmoins je me pose une autre question:

j'ai ma classe DATA contenant tous mes typedefs de map, ainsi que les
maps contenant les données, et les fonctions permettant d'utiliser les
maps.

--------------------------------------------------------
Ex pour une map:

typedef map<AnsiString, ActionsJoueurs> ToutesActions;
typedef ToutesActions::iterator ite_Equipe;
ToutesActions TA;

const ToutesActions & m_TA() const { return this->TA; }
--------------------------------------------------------

Dans d'autres classes je dois utiliser ces données.

Je comptais faire comme ceci: créer une référence de la map basée sur le
typedef de cette map dans DATA, pointant vers la fonction d'utilisation
de la map dans DATA...

C'est pas trop clair je pense, donc un exemple:

--------------------------------------------------------
//La référence à la map
DATA::ToutesActions & TA = A_D->m_TA();

//L'utilisation de la map
DATA::ite_Equipe GO_E = TA.find(ListeEquipes->Text);
--------------------------------------------------------

C'est comme ça qu'il faut faire?

Merci d'avance!!
Avatar
Fabien LE LEZ
On 30 Jul 2003 16:44:32 GMT, Zoubidaman
wrote:

typedef map<AnsiString, ActionsJoueurs> ToutesActions;


Au fait, une remarque en passant : "AnsiString" a été créé par Borland
pour pallier à l'absence de classe "chaîne de caractères" en C++ à
l'époque. Elle est maintenant totalement obsolète, puisque std::string
a été inclus dans le standard.


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Alain Naigeon
"Fabien LE LEZ" a écrit dans le message news:

On 30 Jul 2003 16:44:32 GMT, Zoubidaman
wrote:

typedef map<AnsiString, ActionsJoueurs> ToutesActions;


Au fait, une remarque en passant : "AnsiString" a été créé par Borland
pour pallier à l'absence de classe "chaîne de caractères" en C++ à
l'époque. Elle est maintenant totalement obsolète,


Pour usage général, certes, mais tous les objets de la librairie
qui gardent des chaînes les ont et les renvoient comme des
AnsiString, alors ça reste assez théorique (et malpratique)
d'ignorer ce type, AMHA, quand on programme dans ce
contexte.

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
Christophe Lephay
"Fabien LE LEZ" a écrit dans le message de
news:
On 30 Jul 2003 16:44:32 GMT, Zoubidaman
wrote:

typedef map<AnsiString, ActionsJoueurs> ToutesActions;


Au fait, une remarque en passant : "AnsiString" a été créé par Borland
pour pallier à l'absence de classe "chaîne de caractères" en C++ à
l'époque. Elle est maintenant totalement obsolète, puisque std::string
a été inclus dans le standard.


Elle n'est malheureusement pas encore completement obsolète : c'est le type
chaine utilisé dans BCB par les composants VCL (pour une question de
compatibilité avec Delphi, je suppose)...

Chris


Avatar
Zoubidaman
Qu'apporte std::string en plus qu'AnsiString?
1 2