Référence à une fonction d'une autre classe

Référence à une fonction d'une autre classe - C++ - Programmation

Marsh Posté le 31-07-2003 à 04:32:17    

Salut tout le monde,
 
voici ma question:
 
J'ai la classe DATA suivante (largement simplifiée, mais le principe est là):
 

Code :
  1. struct DATA
  2. {
  3. public:
  4.         typedef map<AnsiString, int> ToutesActions;
  5.         const ToutesActions & m_TA() const { return this->TA; }
  6. private:
  7.         ToutesActions TA;
  8. };


 
Je dois accéder à TA depuis une autre classe, c'est donc la raison pour laquelle j'ai créé la fonction m_TA()
 
Est-ce que le code suivant est correct?
 

Code :
  1. DATA::ToutesActions & TA = A_D->m_TA();
  2. DATA::iterateur GO_E  = TA.find(Text);


 
Ce code fonctionne très bien, mais j'ai le warning suivant à la compilation:
 

Un temporaire a été utilisé pour initialiser 'TA'


 
Peut-être est-ce que je pars (encore) en vrille...
 
Merci d'avance!!


---------------
Another .Net Blog
Reply

Marsh Posté le 31-07-2003 à 04:32:17   

Reply

Marsh Posté le 31-07-2003 à 08:47:00    

C bizzard, j'ai déjà eu ce warning, mais je me souvient plus pkoi. T'aurais un peu plus de code autour de:
 

Code :
  1. DATA::ToutesActions & TA = A_D->m_TA();
  2. DATA::iterateur GO_E  = TA.find(Text);

 
 
?


---------------
Le Tyran
Reply

Marsh Posté le 31-07-2003 à 09:19:30    

sans vouloir fair ele lourd, il se pourrait aussi que tu doives revoir la conception objet de ton code.
Qu'a besoin de faire exactement les objets qui veulent accéder à TA ?
 
Ce code :
 

Code :
  1. DATA::ToutesActions & TA = A_D->m_TA();
  2. DATA::iterateur GO_E  = TA.find(Text);

 
 
pourrait etre remplacer par une methode find() de la classe DATA non ?
 

Code :
  1. class DATA
  2. {
  3. public:
  4.        typedef map<AnsiString, int> ToutesActions;
  5.        const ToutesActions & m_TA() const { return this->TA; }
  6.         iterateur find( char* text ) { return TA.find(text); }
  7. private:
  8.        ToutesActions TA;
  9. };

Reply

Marsh Posté le 31-07-2003 à 09:55:08    

euh si tu renvoie un const &, ben tu peux avoir qu'une const &. pareil pour find, qui est une opération const et donc un const_iterator suffit

Reply

Marsh Posté le 31-07-2003 à 14:42:51    

Joel F a écrit :

sans vouloir fair ele lourd, il se pourrait aussi que tu doives revoir la conception objet de ton code.
Qu'a besoin de faire exactement les objets qui veulent accéder à TA ?


 
La classe DATA permet de stocker dans des maps les données d'un fichier XML.
 
Voici ma déclaration de classe (avec uniquement ce qui nous intéresse):
 

Code :
  1. struct DATA
  2. {
  3. public:
  4.         //Contient la liste des frames pour une catégorie de stats
  5.         typedef vector<int> ListeFrames;
  6.         typedef ListeFrames::iterator ite_Frame;
  7.         //nom de la stat + liste des Frames
  8.         typedef map<AnsiString, ListeFrames> ActionsUneStat;
  9.         typedef ActionsUneStat::iterator ite_Stat;
  10.         //Nom du joueur + stats
  11.         typedef map<AnsiString, ActionsUneStat> ActionsJoueurs;
  12.         typedef ActionsJoueurs::iterator ite_Action_Joueur;
  13.         //Equipe + Joueurs
  14.         typedef map<AnsiString, ActionsJoueurs> ToutesActions;
  15.         typedef ToutesActions::iterator ite_Action_Equipe;
  16.         //Permet d'utiliser la map des stats
  17.         const ToutesActions & m_TA() const { return this->TA; }
  18. private :
  19.         ToutesActions TA;
  20. };


 
Une fois que je fais appel à DATA, je remplis la map TA avec toutes les informations nécessaires.
 
Dans une autre classe, disons ANALYSE, je dois utiliser les données contenues dans TA.
 
Voici comment je procéde (Début de l'algo):
 

Code :
  1. DATA A_D;
  2. //On trouve l'équipe
  3. DATA::ToutesActions & TA = A_D->m_TA();
  4. DATA::ite_Action_Equipe GO_E  = TA.find(ListeEquipes->Text);
  5. DATA::ActionsJoueurs & AJ = GO_E->second;
  6. DATA::ite_Action_Joueur Begin_Joueur = AJ.begin();
  7. DATA::ite_Action_Joueur End_Joueur = AJ.end();
  8. //.....


 
De même ensuite j'effectue une recherche avec find() dans la map AJ...
 
Je parcoure donc successivement les maps imbriquées les unes dans les autres.
 
Je ne sais donc pas si j'ai besoin de définir dans ma classe DATA des fonctions de recherche, etc...


---------------
Another .Net Blog
Reply

Marsh Posté le 31-07-2003 à 14:47:18    

Ca sera toujour splus propre que de faire ca ....
reflechis mieux a ton approche objet.

Reply

Marsh Posté le 31-07-2003 à 14:48:06    

enfin objet avec des struct :ange:

Reply

Marsh Posté le 31-07-2003 à 14:49:38    

VisualC++ a écrit :

enfin objet avec des struct :ange:


 
struct est class c pareil en c++, c juste con d'utiliser deux mots clef pour désigner la même chose  [:spamafote]


---------------
Le Tyran
Reply

Marsh Posté le 31-07-2003 à 14:49:39    

Certes je me comprends .... tu remarqueras que j'avais corrigé  :whistle:

Reply

Marsh Posté le 31-07-2003 à 14:50:18    

VisualC++ a écrit :

enfin objet avec des struct :ange:


 
Je vois pas où est le problème... J'ai pu lire tout partout que struct est équivalent à une classe, sauf que tout est par défaut public
 
Mais là ils sont précisés, donc c'est pareil, non?


---------------
Another .Net Blog
Reply

Marsh Posté le 31-07-2003 à 14:50:18   

Reply

Marsh Posté le 31-07-2003 à 14:51:16    

Oui mais c'est moche.
Reserve l'utilisation des struct au structure de données ne contenant que des memebres publiques, ca rendra les choses clair++

Reply

Marsh Posté le 31-07-2003 à 14:51:49    

Joel F a écrit :

Ca sera toujour splus propre que de faire ca ....
reflechis mieux a ton approche objet.
 


 
Je ne comprends pas en quoi ce que je fais ne respecte pas la POO...
 
Alors quelles sont les fonctions que je devrais rajouter dans ma classe DATA pour la respecter?


---------------
Another .Net Blog
Reply

Marsh Posté le 31-07-2003 à 14:52:00    

Bah de mon experience perso y a des choses que les struct supporte pas suivant les compilo et OS (comme un constructeur/destructeur cequi est bien genant pour une appelation dite objet)
 
Enfin cela n engage que moi

Reply

Marsh Posté le 31-07-2003 à 14:54:38    

VisualC++ a écrit :

Bah de mon experience perso y a des choses que les struct supporte pas suivant les compilo et OS (comme un constructeur/destructeur cequi est bien genant pour une appelation dite objet)
 
Enfin cela n engage que moi


 
Travaillerais tu avec le compilo qui a inspiré ton pseudo? C pas un vrai compilo c++! :D


Message édité par LetoII le 31-07-2003 à 14:54:47

---------------
Le Tyran
Reply

Marsh Posté le 31-07-2003 à 14:55:07    

haazheel a écrit :


 
Je ne comprends pas en quoi ce que je fais ne respecte pas la POO...
 
Alors quelles sont les fonctions que je devrais rajouter dans ma classe DATA pour la respecter?


 
respecte au moins la FCC (forme canonique de Coplien)
 
Constructeur par défaut
Constructeur de recopie
destructeur
operateur d'affectation ...
 
et puis ecris juste class a la place de struct :O

Reply

Marsh Posté le 31-07-2003 à 14:56:19    

LetoII a écrit :


 
Travaillerais tu avec le compilo qui a inspiré ton pseudo? C pas un vrai compilo c++! :D


 
Entre autre mais les pb c plutot avec gcc ;)

Reply

Marsh Posté le 31-07-2003 à 14:57:03    

VisualC++ a écrit :


 
Entre autre mais les pb c plutot avec gcc ;)


 
bah GCC == 0 problem désolé , le GCC 3.3 rulezdaworld :O

Reply

Marsh Posté le 31-07-2003 à 14:58:35    

j ai pas dit que le code au dessus pose pb la avec gcc, mais une structure avec un constructeur gcc compile pas (ver 3.2 et 3.3 sous solaris en 64bits par exemple ... teste y a moins de 15 jours)

Reply

Marsh Posté le 31-07-2003 à 14:59:00    

Joel F a écrit :


 
respecte au moins la FCC (forme canonique de Coplien)
 
Constructeur par défaut
Constructeur de recopie
destructeur
operateur d'affectation ...
 
et puis ecris juste class a la place de struct :O


 
Mis à part struct, que je viens de changer, ma classe répond au reste...
 
Mais tu me conseillais d'ajouter une fonction find(), qu'est-ce qu'il faudrait que je rajoute en plus?


---------------
Another .Net Blog
Reply

Marsh Posté le 31-07-2003 à 15:00:13    

ben  
 

Code :
  1. class DATA
  2. {
  3.   // tout tes trucs
  4. iterateur find( AnsiString text ) { return TA.find(text); }
  5. };

Reply

Marsh Posté le 31-07-2003 à 15:14:03    

Ca ok, mais comme je l'ai mentionné plus haut, j'ai des maps qui sont imbriquées les unes dans les autres...
 
Est-ce que je dois créer une méthode find() pour chacun d'entre elles?


---------------
Another .Net Blog
Reply

Marsh Posté le 31-07-2003 à 15:17:01    

Bah a toi d'ecrire un algo de recherche propre la dedans.

Reply

Marsh Posté le 31-07-2003 à 15:21:25    

Joel F a écrit :

Bah a toi d'ecrire un algo de recherche propre la dedans.


 
Ouais, bah je l'ai déjà écrit dans les classes qui en ont besoin... Donc je vais en rester là...
 
Merci pour tout!!


---------------
Another .Net Blog
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed