[C++] map - fonction

Statut
N'est pas ouverte pour d'autres réponses.
N

niafron

ex membre
aaaah le cpp ... que du bonheur :D

bon g une petite interrogation qui a germe dans ma tete

mon probleme explike en qqmots

g une map qui fait la relation entre un ordre et une action a faire

le probleme : mes actions seront sous forme de fonction
comment pouvoir associe la fonction a la map


interpreter::my_order.insert(order::value_type(element, action));

- interpreter : nom de ma classe
- my_order : nom de ma map
- order : typedef de la map

si qqun a une idee pour eclairer ma pauvre lanterne, je l en remercie d avance
 
ben en fait, si j'ai bien compris, tu veux :


|un ordre associé| à une action.|
|"Fermer fenêtre"|this->Close();| par exemple

Hé bien, pourquoi ne pas créer une classe d'actions...
Comme ça ton action sera un objet.

Sinon tu passes par une classe d'outils avec un constructeur définit en privé (pas d'instance de la classe) ou tu définis tes fonctions dans un espace de nom, dans un cas comme dans l'autre pour l'appeller tu fais maClasse::maFonction(...);
ou monEspaceDeNom::maFonction(...); => utilisation de l'opérateur de résolution de portée.


now, tu peux aussi créer un
enum Actions {DORMIR, DEBOUT, FERMER, FRAGUER };
Définir ensuite des "variables" correspondantes aux actions (comme des objets instances de leur classe)
et via un switch(variableActions) { case: ... } définir le code
des actions ou tout simplement faire l'appel de l'action qui se trouvera sous forme de méthode de classe, fonction ext ... ou autre.
 

FoX2000

Revenant
C'est quoi le rapport avec [HTML, PHP, Webdesign]?

=> :arrow:
 
En fait, un conteneur contient :D des objets ou des types primitifs ...


genre une deque de nombre entiers c'est (via STL)

int entier = 7;
std::deque < int > listeEntiers;
listeEntiers.push_back(5);
listeEntiers.push_back(6);
listeEntiers.push_back(entier);



donc, il te faut des instances de classe, des types utilisateurs, ou encore des enumérations...
 
1er
OP
N

niafron

ex membre
merci bcp ;)


edit : merci Mav je viens juste d avoir la revelation ( je dois avouer ke c t tres trouble ds mon esprit ) mais la c devenu clair

merci bcp tu menleves une belle epine du pied ;)
 
1er
OP
N

niafron

ex membre
ds la continuite du probleme


g donc appliker ta methode : une classe utilitaire qui reprend toutes les actions possibles

arrive la definition de la map

typedef std::map<char, order_util> order;

le probleme, il ne reconnais pas order_util comme etant une classe
d:\programmation\cpp\Graftal\interpreter.h(12): error C2065: 'order_util' : undeclared identifier

l include est bien present ;) et la classe ressemble a ceci

Code:
#ifndef _ORDER_UTILITY_H_
#define _ORDER_UTILITY_H_

#include "interpreter.h"
#include "verbose.h"
#include "define.h"

class order_util {
private:

public:
	// fct : ajout d'un dessin - appel la fonction draw de la tortue
	position posPop(spos &my_stack);
		// revenir a un point - depiler
	void posPush(spos &my_stack);
		// empiler des positions

};

#endif

ma question : existe t il un namespace particulier pour le type classe ?



----------------------------

bon apres avoir ecrit ces lignes, g tenter de faire

typedef std::map<char, class::eek:rder_util> order;
( pour essayer )
la le probleme ( et je vois pas trop ce que ca veut dire un global namespace ) est :
d:\programmation\cpp\Graftal\interpreter.h(12): error C2039: 'order_util' : is not a member of 'operator``global namespace'''


la je suis un peu :shock:

au secouuuuuuur

- la STL et moi on est pas encore fort copain;) -
 
typedef std::map<char, class::eek:rder_util> order;
...
std::map < char, order_util > mesOrdres;

dès lors que ta classe est définie, en écrivant "class::eek:rder_util", là tu appelles ta classe par elle-même... Enfin, avec l'include de l'entête de ta classe, le compil sait très bien que order_util est une classe ...

vu que si tu faisais sur le côté :

Code:
#include "order_util.h"
order_util unUtil;
//ou encore
order_util * utilDyn = new order_util;
// ça fonctionnerait, si c n'est pas le cas : 
/* alors faut vérifier ton ou tes constructeurs */

ton conteneur doit contenir des objets d'un type primitif (char, char*, int, double etc...) ou d'un type définit par l'utilisateur.
Il n'y a qu'à voir les types primitifs comme des types classes ...

En fait dans ton construsteur, tu pourrais avoir comme paramètre la clé de ta map par exemple pour dire quel objet tu as besoin, enfin de savoir que cet objet là sait faire telle ou telle chose (méthode)



genre, tu crées une classe TVecteur :

Code:
// t'oublies pas les inclusions #

class TVecteur
{
      int x, y;
      int direction;
   public:
      TVecteur();
      TVecteur(int deb, int fin, int dir);
       // ...
};

Si tu veux créer euh, un vecteur de TVecteur lol, tu feras :

Code:
#include <vector>
#include "TVecteur.h"  // il est bien de nommer le fichier comme 
                               // la classe

std::vector < TVecteur > monVecteur2D;
et non un std::vector < class::TVercteur > ;)


(conceptuellement le vecteur 2D d'objets TPosition serait mieux, c'était juste pour se marrer...
Note : un vector2D made in STL (enfin comme B.Stroup aime)
std::vector < std::vector < TMonObjet > > vecteur2D;)
 
PS : si tu utilses beucoup de conteneurs de la STL, tu peux
faire un "using namespace std;"

ça t'évite de devoir taper std:: pour atteindre ce que tu veux...
ou alors, toujours en début de fichier, tu tapes "using std::CE_que_tu_veux_atteindre;"
 
1er
OP
N

niafron

ex membre
merci mav. :D

en fait le probleme c que je mettais mon typedef dans mon .h et la il me dit flute. Dans le .cpp il comprend ce que je veux dire o_o" ( certaines choses resteront mysterieuses a mes yeux )
ce qui est emmerdant :)
 
Statut
N'est pas ouverte pour d'autres réponses.
Haut