930

Folco (./928) :
Ca signifie donc que la classe mère comporte un constructeur, alors qu'on pourrait s'en passer si la classe dérivée construisait les objets protected. Ok.
Ça c'est pas vraiment (pas du tout) une manière propre de faire.
Sinon, g++ refuse que mon destructeur de classe mère ne soit pas virtuel, pourquoi ? Quelle est la conséquence que ce destructeur soit virtuel ?
Tiens je savais pas que le compilo t'interdisait carrément les destructeurs non virtuels ^^
Mais en gros c'est simple. Normalement, le C++ est compilable sans RTTI (l'équivalent très modeste de la réflexion en C# ou Java).(); // B dérive de ADonc si tu déclares A* truc = new BAlors, le compilateur sait juste que "*truc" est de type A. Si ton destructeur n'est pas virtuel, il va apeller le destructeur de A, puisque il sait seulement que *truc est de type A.
En revanche, avec un destructeur virtuel, il va apeller le destructeur attitré à "truc", à savoir soit le destructeur de A, soit celui de B si B a redéfini le destructeur de A… Tes ressources seront ainsi bien libérées comme il faut.
Il va en fait être redéfini par la classe dérivée, mais les deux destructeurs seront appelés simultanément lors de la destruction de l'"objet dérivé" ? (CROSS !!! Je tombe sur ça GC, mais pourquoi ???)
Ils ne sont pas appelés simultanément. Les éléments de la classe enfant dépendent (potentiellement) des éléments de la classe parent.
C'est comme quand tu t'habilles et te déshabilles. Tu mets d'abord le slip, puis le pantalon, et puis tu retires le pantalon avant de retirer le slip (car le pantalon est par dessus le slip). Tu ne peux pas retirer le slip avant le patanlon (enfin, tu peux en te tordant bizarrement, ok…), à moins que tu n'aies également mis le slip après avoir mis le pantalon tongue
Pour continuer le cross, oui, j'ai relu cet après-midi le chapitre sur l'héritage multiple, ça suppose visiblement de bien poser ses mécanismes d'héritages et de virtualisation pour ne pas se faire baiser...
Bah, le C++ est un peu trop permissif sur ce point malheureusement, mais si tu te limites à de l'héritage multiple propre comme en C#, Java & compagnie, y'a pas besoin d'énormément de contorsions neurales ^^
Et enfin, je suis dans le cas d'une classe mère jamais instanciée en stand-alone (aucun intérêt, l'objet n'est pas fait pour ça et ne représenterait rien). C'est d'ailleurs pour ça que toutes ses méthodes sont virtuelles, sans implémentation.
Ouais, mais dans beaucoup de cas tu auras également besoin d'une classe abstraite, proposant une partie de l'implémentation, et demandant aux enfants d'implémenter le reste. Une classe purement abstraite (une interface), par contre, ne doit pas déclarer quoi que ce soit d'autre que des méthodes virtuelles "pures" (au sens C++).
D'ailleurs j'espère que tu as bien pensé à déclarer tes méthodes comme telles ^^
(PS: virtual void machinChose() = 0wink
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

931

Regarde: Design Pattern : Inversion de dépendance
Sinon il faut aussi faire attention aux responsabilités et bien distinguer héritage et agrégation: Design by Contract Bertrand Meyer.

932

Folco (./925) :
(il donne quelques tips "en java" pour préparer celui qui voudrait s'y mettre).

Ha, c'est un bon l'auteur de ton bouquin grin
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

933

JackosKing (./932) :
Design by Contract Bertrand Meyer.


il commence à me sortir par les yeux a force de le citer celui là angry

934

Moi c'est juste qu'il rentre pas dans mon porte-monnaie, mais je les boufferais ces bouquins si je pouvais grin

Golden -> merci encore une fois pour toutes tes explications happy

sinon, pourquoi le virtual void choseMachin() = 0 ?!?

935

Ça définit une « méthode virtuelle pure » en C++, autrement dit une méthode abstraite/sans implémentation.
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

936

Ah oki, merci ^^

Si ya un truc dont je me rends de plus en plus compte : Quelle merde la syntaxe du C++ !
grin

937

Marrant Folco, dans la page précédentes tu demandes à quoi ça sert de n'avoir que des méthodes abstraites, comme si tu utilisais ça depuis longtemps, et là tu te poses des questions sur la syntaxe grin
La syntaxe est difficile, on te l'a dit, mais tu devrais quand même peut être te poser un peu moins de questions wink
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

938

Brunni (./937) :
à quoi ça sert de n'avoir que des méthodes abstraites, comme si tu utilisais ça depuis longtemps, et là tu te poses des questions sur la syntaxe biggrin.gif

1. Je me suis dit, "si ça existe, ça a sûrement son utilité, comment ça pourrait m'être utile pour faire ce qui m'intéresse"
2. On m'a expliqué, j'ai (re)lu mon bouquins, puis après vient l'implémentation et les détails àlakhon auxquels je n'ai pas pensé avant
grin

939

Bah, les méthodes virtuelles pures correspondent à des pointeurs nuls dans la vtable, d'où la notation = 0.
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é

940

Ouais mais quand je fais du Java je n’ai même pas besoin de savoir ce qu’est une vtable et je peux quand même écrire des opérations abstraites (dans une syntaxe intuitive).
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

941

C'est vrai qu'on a un peu moins l'impression de faire de la merde en écrivant:
interface Drawable {
    void setColor(Color c);
    void draw(Graphics g);
}

Qu'en écrivant:
class Drawable {
public:
    void setColor(Color c) = 0;
    void draw(Graphics* g) = 0;
}

Mais c'est parfaitement identique, sinon. Il faut juste se souvenir que c'est un cas particulier de n'avoir que des méthodes virtuelles.
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

942

pareil en java, une classe parfaitement abstraite est similaire à une interface, sauf que t'as un héritage multiple d'interfaces et pas de classes.

mais l'écriture est plus claire en java, oui.

943

Tu as l'héritage multiple quoi qu'il arrive en C++, pas seulement pour les interfaces (faut faire gaffe avec ça d'ailleurs).
Dans le cas du design pattern Adaptateur par exemple tu peux éviter la composition (c'est éventuellement plus performant).
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

944

./941 Tu as oublié le mot-clé virtual.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

945

Ho putain. Genre de truc super vicieux à déboguer en plus sorry
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

946

(pas vraiment non, une methode virtuelle pure sans le virtual ca compile pas, ca va encore ^^)
avatar
HURRRR !

947

squalyl (./933) :
JackosKing (./932) :
Design by Contract Bertrand Meyer.


il commence à me sortir par les yeux a force de le citer celui là angry

C'est pas le même que mon précédant poste hein^^

Sinon il suffit d'utiliser un petit peut google: DIP design pattern.
C'est quand même la base des design pattern, et un très bonne compréhension de celui-ci permet très vite d'avoir un code propre & réutilisable.

Quant à la programmation par contrat, c'est surtout sa mise en place dans le principe de l'héritage qui est intéressante: notion de covariance.

948

Folco (./936) :
Si ya un truc dont je me rends de plus en plus compte : Quelle merde la syntaxe du C++ !
grin

(#sifflote# tongue)
GoldenCrystal (./930) :
(enfin, tu peux en te tordant bizarrement, ok…)

mm ? trifus

949

Bon, je suis un très mauvais élève au regard de ce que vous tous, mes profs, essayez de m'enseigner. En fait, je suis complètement découragé, pour une raison très conne : comme je ne maitrise pas tous les tenants et aboutissants de ces classes dérivées, de la virtualisation, de l'héritage multiple et du polymorphisme, j'ai l'impression qu'en avançant, je vais faire des choses vraiment dégueu en terme de conception et de code. Je ne pense même pas au côté pas optimal niveau perf qui en résultera (les formules 1 d'aujourd'hui permettant de faire passer ça inaperçu pour des petits programmes). Bref, je suis certain de ne pas faire les bons choix malgré tous vos conseils, et ça me gonfle, parce que idéalement, je voudrais écrire le programme techniquement parfait, et non le brouillon fait à l'arrache de celui qui bricole...

Donc je n'ai qu'une envie, repartir au C, avec des trucs comme ça : typedef struct {int bidule, long chose, const char *machin, void (*méthode) (long trucmuche, int chouette)} Objet_chose;
Voilà, ça garde le concept d'objet que je trouve génial en soi, et ça évite de se perdre dans les méandres et complexités des différentes relations entre classes que je ne maitrise pas.

CA M'ENERVE DE NE PAS MAITRISER BORDEL !!!!

Sur ce, je suis fatigué, et la nuit portant conseil, je vais dormir. ciao

950

Folco (./949) :
je voudrais écrire le programme techniquement parfait
Ça n'existe pas, surtout en C++ cheeky
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

951

Bof, en C tu vas perdre pas mal de temps si tu essaies de simuler de l’objet… Autant profiter directement du C++.

Enfin bref, pour ce qui est du fond, sache que des étudiants en Master avec moi pondent encore des architectures imbitables, loin d’être « techniquement parfaites », et pourtant on est dans une spécialité « Génie Logiciel ». Tu vois bien aussi qu’en discutant on constate qu’il n’y a pas vraiment une solution parfaite à un problème, mais plusieurs solutions possibles, chacune avantageuse au regard de certaines priorités qui ne sont pas forcément elles-même clairement définies. Et enfin c’est à peu près ta première expérience en C++, ça me semble particulièrement difficile du premier coup d’être capable de trouver les meilleures solutions, d’assimiler et de maîtriser tous les concepts de prog objet qui sont nouveaux, etc. (perso ça fait presque 10 ans que je fais de la prog objet et j’en apprends encore chaque jour)

Donc tout ce que je peux te dire c’est : code, même si ce n’est pas parfait. Frotte-toi justement à des imperfections, à des problèmes, c’est comme ça que tu sauras le mieux les éviter par la suite. Tu peux apprendre plein de concepts théoriques en peu de temps, mais pour savoir bien les utiliser il faut de l’expérience, et ça, il faut accepter que ça prenne un peu de temps pour se constituer.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

952

Au passage, je te suggère de contribuer à des projets open-source plutôt que de coder des softs perso.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

953

trifus alors la je vois vraiment pas ou se trouve la pertinence de ce conseil.

c'est un peu comme 'va bosser à la mine au lieu de faire ton entreprise'

954

C'est la philo qu'il te faut :
I would find it harder if I had to spend all my time learning how to use somebody else’s routines. It’s much easier for me to learn a few basic concepts and then reuse code by text-editing the code that previously worked

http://www.codersatwork.com/

955

C'est un très bon conseil, mais c'est un peu tôt je pense.

956

Folco ton problème c'est que tu veux faire 2 choses en même temps:
* Apprendre le C++
* Apprendre la POO
Les deux sont extrêmement complexes, d'où les conseils insistants de partir sur un langage qui te facilite la tâche au moins pour apprendre la POO, histoire de ne pas tout mélanger.
C'est complètement faux qu'un programmeur Java ne pourra jamais maîtriser les concepts du C++ (je fais les 2, enfin plutôt du C à choisir mais bref). C'est toujours possible d'y revenir plus tard, et après y avoir goûté tu verras que c'est très très pratique d'avoir sous la main un langage de référence dans lequel tu te sens à l'aise pour partir sur de gros projets que tu abandonnerais à l'état d'idée sinon wink
Bref ce n'est pas perdu. Et si vraiment tu venais à aimer la facilité du Java, alors tu pourras enfin commencer les choses intéressantes dans la conception de logiciels. Au contraire, si tu n'aimes pas, tu n'auras qu'à chercher à appliquer ce que tu auras appris au C++.
Mais tu peux aussi crocher plus sur le C++. Comme tu veux. Mais abandonner serait dommage, surtout après tous les conseils qu'on t'a donnés wink
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

957

./953 > Il participait au concours du pire conseil à donner à un débutant. Je pense qu'il a gagné le premier prix. tongue
Après, je trouve que le C++ est un langage vraiment mal conçu (et horrible), et il fait certainement partie des pires langages pour aborder la POO, mais bon… Chacun fait comme il veut. Et on va encore me gueuler dessus si je balance le nom du langage que je pense être le meilleur pour tout appréhender, donc… 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

958

(mais moi je suis intéressé si ce n'est pas Java smile J'ai ma petite idée mais je te connais pas assez ^^)
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

959

Mais euh pourquoi mon conseil vous paraît-il bidon ?

Lire du code de l’extérieur permet d’apprendre ;
Contribuer et subir de review de code permet d’apprendre ;
Bef, c’est donnant-donnant : tu rends service aux utilisateurs des logiciels et tu te formes.

Bon, c’est vrai que c’est peut-être un peu tôt. Enfin, faut bien commencer à un moment.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

960

Tout bêtement parce que le C(++) est un langage write-only wink
Il n'est pas particulièrement fait pour être lisible et relu (même pour celui qui l'a écrit c'est généralement chaud qqes temps après, même bien commenté).
Ensuite comme il n'y a pas vraiment de convention, c'est difficile de prendre de bonnes habitudes, chaque projet fait un peu comme il pense.
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