Merci pour tout, sans vous tous j'en serais pas à 1% du peu que j'ai déjà fait

Folco (./1315) :GoldenCrystal (./1309) :
Bah justement, ils ne devraient peut être pas s'ignorer totalement. enfin, y'a au moins un truc qui devrait ne pas les ignorer.
Typiquement, un clic sur un bouton va appeler une méthode (on est d'accord jusque là non ?), et c'est cette méthode qui va se charger de refléter le clic sur le reste du programme. (En lieu et place d'envoyer un message !)
Mais justement, je ne comprends pas là où tu veux que j'en vienne...
Schématiquement, mes classes sont instanciées comme ça :
main() instancie Task
Task instancie ModuleTruc (en dérivant de Module)
ModuleTruc instancie IconMachin (en dérivant de Icon)
Comment veux-tu que IconMachin "reflète le clic sur tout le reste du programme", donc au niveau de Task, de Module et de Icon ?
A la rigueur, seul ModuleTruc peut lancer une méthode de IconMachin pour avoir une valeur de retour, mais à partir d'une méthode de iconMachin, je ne peut strictement rien faire sur "tout le reste du programme".
Tu vois les choses comment toi ?
Ça te donnerait un truc du genre :
abstract class IconMachinListener {
public:
abstract void actionPerformed( ActionEvent ae )= 0 ;
} ;
classe ModuleTruc implements IconMachinListener
{
public:
void plop() {}
void actionPerformed( ActionEvent ae )
{
std::cout << "bouton cliqué " << ae.getSource().getName() ; //getSource retourne le bouton par exemple, c'est juste histoire de dire :p
}
} ;
class Icon
{
public:
void addIconMachinListener ( const IconMachinListener* iml )
{
listeners.push_back(iml) ;
}
abstract void click()= 0 ;
protected:
void notifyAllListerners( ActionEvent ae )
{
foreach listerner in listeners
listener.actionPerformed(ae)
}
vector<const IconMachinListener*> listeners ;
}
class IconMachin extends Icon
{
void click()
{
//tu fais ce que tu veux, puis :
notifyAllListerners(new ActionEvent("koko")) ;
}
}
et du coup dans le constructeur de ModuleTruc, tu fais un truc du genre :
ModuleTruc()
{
IconMachin im ;
im.addIconMachinListener(this) ;
//oué je sais que im sera libéré, c'est juste expliqué en gr
(c'est à lire en diagonale, c'est du pseudo code de toute façon)
class Message
{
public:
Message();
virtual ~Message();
void registerMessenger(int ID, Receive *object);
void removeMessenger(int ID);
virtual void sendMessage(int ID);
private:
Message(const Message&);
Message operator=(const Message&);
std::map<int, Receive*> m_EntriesList;
};

Fichier joint : html.zip
), qui serait un singleton. (ça t'évite de passer l'instance de partout même si ça serait une manière plus propre de faire)
// Classe Icon de base
class Icon
{
const std::string title;
const std::string image; // En vrai il faudrait peut être stocker une ressource SDL à la place
public:
Icon(const std::string& title, const std::string& image) : title(title), image(image) { }
const std::string& getTitle() { return title; }
const std::string& getImage() { return image; }
virtual void Action() = 0;
};
#define REGISTER_ICON(title, image, action) class action ## Icon : public Icon { public: action ## Icon () : Icon(title, image) { } void Action() { Main::getInstance(). ## action ## (); } };
REGISTER_ICON("Buy Item", "buy.png", DoBuyItem)
REGISTER_ICON("Kill Units", "kill.png", DoKillSelectedUnits)
// Etc.Y'a moyen de faire mieux (c'est un exemple semi à l'arrache, idéalement tu pourrais même utiliser des classes anonymes pour les icônes, sous certaines conditions) et je suis pas complètement sur de pas m'être foiré sur la macro, mais bon 

) a été fait pour te simplifier la vie. Et si jamais ça ne la simplifie pas, c'est probablement que tu as fait une erreur quelque part.
)
GoldenCrystal (./1336) :(ou que l'approche OO n'est pas la bonne méthode pour résoudre le problème, ou qu'elle ne correspond pas à ta façon de réfléchir, ou...)
Et si jamais ça ne la simplifie pas, c'est probablement que tu as fait une erreur quelque part.
)GoldenCrystal (./1336) :
Sinon, j'ai oublié de le dire parce que pour moi c'est une évidence, mais l'objet (enfin peut être pas le C++) a été fait pour te simplifier la vie.


)
GoldenCrystal (./1330) :
(Tu crois que j'en parlerais si ça n'existait pas ?)
struct { int a, b; } c;
Vous noterez que j'ai choisi cet exemple car c'est également du C parfaitement valide.GoldenCrystal (./1345) :struct { int a, b; } c;Vous noterez que j'ai choisi cet exemple car c'est également du C parfaitement valide.
)
) sans nom, non ?
new Thread() {
public void run() {
blabla();
}
}.start();
enum {Start, Working, End} state = Start;
...
state++;
struct {
char c;
Token tokType;
} uniCharTokDict[] = {
{'(', T_LEFTPAR},
{')', T_RIGHTPAR},
{'.', T_DOT},
...
};