1320

Bon ok, je continue grin

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

1321

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 ? tongue.gif ), 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 ?

J'ai rien lu du problème en amont, mais pourquoi IconMachin ne pourrait pas connaître l'instance de ModuleTruc ?
En JAVA c'est d'ailleurs plus ou moins comme ça que ça marche les listeners.


os, c'est pas la question, là :o }
Ç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



De cette manière, l'instance de ModuleTruc (et tout ce qui aura été ajouté à la liste de listeners définie dans Icon) est avertie dès qu'il se passe un truc dans IconMachin.
Après, à toi de voir pour savoir où tu veux propager les événements, bien sûr. Là c'est sans doute un peu n'importe quoi grin

J'espère que je ne poste pas n'importe quoi, j'ai pas le courage de me relire, dsl cheeky (c'est à lire en diagonale, c'est du pseudo code de toute façon)

PS : c'est du tarif de nuit trivil

1322

Oué, j'avais proposé et implémenté ça :
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;
};

Donc on passe par une classe message que tout le monde connait pour communiquer. Avantage sur ta méthode, seul l'objet qui va bien est notifié de ce qui se passe.

En fait, mon problème vient tout simplement de ce que Icon est instancié par Module. Donc Module connait Icon et peut appeler ses méthodes, mais Icon ne connait pas Module, donc ne peux pas appeler ses méthodes.

J'ai une solution crade : quand Module crée Icon, il lui file son this pour qu'Icon connaisse Module.


Et merde ça fait chier, j'ai rien corrigé de mes problèmes de conceptions avec toutes ces belles théories :/

ps -> tiens : $1000, et merci smile

1323

tu veux pas lancer un coup de doxygene sur ton code qu'on voit à quoi ca ressemble?

1324

De quoi ? oO

Je veux bien faire ce que tu veux, je regarde d'abord ce qu'est doxygene grin

1325

Ok, génération faite, je complète quelques héritages pas encore mis en place pour donner une idée au plus juste...

1326

Voilà le zip, il se décompresse dans son répertoire, n'ayez pas peur de pourrir vos dossiers ^^
tromb Fichier joint : html.zip

1327

Ah, grâce à JackosKing, j'ai compris le problème \o/
Je sais toujours pas à quoi servent tes task et tes modules, mais en gros, les méthodes d'action devraient se situer dans une classe plus générale, disons une classe "Main" (parce que je comprends pas ton architecture de task et module tongue), 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)
Dans ta classe Main tu as par exemple DoAddUnit(), DoKillSelectedUnits(), DoBuyItem(), etc. (ce sont des exemples, et je met le Do ici pour bien montrer que ce sont des actions, mais en vrai on s'en fout ^^).
Ensuite, tu peux avoir ton fichier de définition d'icônes. Par exemple: // 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 tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1328

(Ça existe les classes anonymes en C++?)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1329

Malheureusement, j'ai beau essayer de lire et relire ta macro, j'arrive pas à comprendre grin
Qui hérite de quoi et qui instancie quoi ?

Main possède des méthodes d'action (virtuelles pures), et Icon qui hérite de main implémente ces méthodes ? Non c'est pas ça ?

(cross : oui)

1330

(Tu crois que j'en parlerais si ça n'existait pas ?)
Folco > Non, "Main" implémente les méthodes (et a une vue globale sur l'application), et Icon les appelle tongue
(À toi de voir qui doit être ce "Main" dans ton application)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1331

Ok. Donc je suppose que main doit être globale pour être vue par tous les éléments fabriqués dans les diverses classes ?
Je vais avoir un main avec 10 000 méthodes ^^

1332

Une classe Main? sick Autant coder en procédural alors!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

1333

Ben j'allais le dire, c'est ce que je ferais en C en fait, je trouve que ça perd beaucoup de l'intérêt de l'encapsulation et de l'indépendance des objets les uns par rapport aux autres, même si la méthode de Golden est probablement la plus simple et la plus efficace.

1334

Non mais le "Main" c'est un exemple. Dans ton cas ça serait peut-être Task ou Module, j'en sais rien. tongue
Après, tu aura forcément au moins une méthode par action, tu ne peux pas y couper, mais pareil c'est un exemple, toutes les méthodes ne sont pas forcément dans le même objet. Faut juste que tu conçoives bien ton application pour qu'il y ait une certaine cohésion entre les objets. (Si aucun objet ne connaît aucun autre objet, même avec des messages, tu finira par atteindre une limite infranchissable à un moment ou un autre)
Bref faut pas prendre ça pour "la solution directe", c'est juste un exemple simplifié de solution. tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1335

Oki. Faut que je réfléchisse dur à tout ça quoi grin (ah, on me souffle que c'est normal quand on programme ?!? eek)

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++ tongue) 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.
Pour la notion de "simplifier", il me semble qu'une bonne mesure en général (= pas toujours*), c'est moins de lignes de code à écrire. Surtout moins de lignes de code "efficaces", les autres ça sert comme second niveau de comparaison.
(Ligne de code efficace pour moi c'est "i++;" par exemple; "class A : B" ou "void Toto(int a, int b)" c'est la décoration; et les commentaires ça compte pas tongue)
Note que bien maîtriser la programmation impérative sans objets ça aide déjà à savoir factoriser le code, donc à réduire le nombre de lignes efficaces.

* ça peut augmenter considérablement le nombre de lignes dans certains cas (ex: écriture d'une librairie objet complexe), dans le but de le réduire énormément ailleurs (ex: code utilisateur utilisant cette librairie)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1337

GoldenCrystal (./1336) :
Et si jamais ça ne la simplifie pas, c'est probablement que tu as fait une erreur quelque part.
(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...)
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

1338

(... ou que tu fais du c++, ou...)

1339

./1337 > Ouais enfin l'orienté objet inclut le pas orienté objet dedans, donc... ^^
./1338 > (Han, espèce de mauvaise langue ! ... pencil )
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1340

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++ tongue.gif ) a été fait pour te simplifier la vie.

Plein de règles que je vois sont foutues pour les entreprises, parlent de réutilisabilité et de maintenance, dont j'ai à peu près strictement rien à foutre.
J'aurais 0 problème si je mettais toutes mes variables globales au programme et que j'instanciais toutes les classes dont j'allais avoir besoin au boot. Le but de ma démarche est justement d'apprendre à faire bien, pas à faire à la va-vite, comme ça doit être le cas très souvent en entreprise...

1341

(topic c++)
Folco (./1340) :
parlent de réutilisabilité
grin
et de maintenance
laught

1342

./1340 > Non c'est des règles pour coder proprement, ne confonds pas tongue
Les variables globales et les classes instanciées au boot c'est dégueu et désastreux sur les performances. tongue
Les règles "pour coder en entreprise" moi je les connais pas, et en tout cas les règles pour coder proprement sont pas si souvent appliquées, rassures-toi...
./1341 > (Vilain troll grin)
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1343

Pour faire du C de bonne qualité, il suffit d'appliquer les règles MISRA trioui

1344

GoldenCrystal (./1330) :
(Tu crois que j'en parlerais si ça n'existait pas ?)

Justement je n'ai jamais vu passer quoi que ce soit qui ressemble à des classes anonymes. Tu peux me montrer brièvement à quoi ça ressemble?
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1345

struct { int a, b; } c;tongue Vous noterez que j'ai choisi cet exemple car c'est également du C parfaitement valide.
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1346

Je passe mon temps à utiliser ça en C ^^

1347

GoldenCrystal (./1345) :
struct { int a, b; } c;tongue Vous noterez que j'ai choisi cet exemple car c'est également du C parfaitement valide.

Ha oué en effet. Je connaissais ça comme un "anonymous inner type" mais j'ai pas fait le rapprochement avec le coup de la classe anonyme ^^
Par contre pour faire l'équivalent de ce que fait le java c'est dégueulasse ^^'
(Mais merci de l'indication sinon happy)
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741

1348

Ben c'est bien une classe (struct mais spareil tongue) sans nom, non ? tongue
Faut pas chercher très loin. ^^
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

1349

lol je m'attendais à un truc gore qui émulerait trop mal le superbement concis:
new Thread() {
    public void run() {
        blabla();
    }
}.start();

tongue

1350

Bah oué, mais bon en réalité je m'en sers pas du tout dans le même contexte que les classes anonymes Java, c'est pour ça que ça ne m'a pas sauté aux yeux tongue
Ce que j'appelle les types anonymes (et non classes, parce que c'est général) j'utilise par exemple pour les machines d'état:
enum {Start, Working, End} state = Start;
...
state++;

Ou à la limite pour des trucs bien dégueu mais compacts genre:
struct {
    char c;
    Token tokType;
} uniCharTokDict[] = {
    {'(', T_LEFTPAR},
    {')', T_RIGHTPAR},
    {'.', T_DOT},
    ...
};
avatar
Highway Runners, mon jeu de racing à la Outrun qu'il est sorti le 14 décembre 2016 ! N'hésitez pas à me soutenir :)

https://itunes.apple.com/us/app/highway-runners/id964932741