120

Folco: vala le truc, si tu fais comme ./119 ça marche comme java.

alloué dynamiquement, pas moyen de faire desvoid truc () { MaClasse plop(42,53); plop.methode(); }en fait le truc agréable du java c'est que TOUT est objet

ode(); }
le java:void truc () {
  MaClasse plop = new MaClasse(42,53);
  plop.meth


op = new MaClasse(42,53); plop->methode(); }
est équivalent à utiliser des pointeurs en c++void truc () {
  MaClasse* pl


(faut savoir qu'apparemment, en C++ "struct" et "class" sont synonymes)

121

Sasume (./119) :
Non non, si tu fais un tableau de pointeurs vers quoi que ce soit, quand tu instancieras le tableau ses éléments ne seront pas instanciés :

Ok, donc faire un tableau de pointeurs et non un tableau d'objets.
squalyl (./120) :
(faut savoir qu'apparemment, en C++ "struct" et "class" sont synonymes)

Et union également, sauf que si j'ai bien lu, les éléments de la classe (et donc les attributs) sont alors publics par défaut (mais alors je vois pas trop l'intérêt côté POO).

122

Folco (./121) :
Sasume (./119) :
Non non, si tu fais un tableau de pointeurs vers quoi que ce soit, quand tu instancieras le tableau ses éléments ne seront pas instanciés :
Ok, donc faire un tableau de pointeurs et non un tableau d'objets.
Bah, pourquoi ça serait nécéssairement mieux ? Si tu peux te passer de pointeurs, alors passe toi de pointeurs.
squalyl (./120) :
(faut savoir qu'apparemment, en C++ "struct" et "class" sont synonymes)

Et union également, sauf que si j'ai bien lu, les éléments de la classe (et donc les attributs) sont alors publics par défaut (mais alors je vois pas trop l'intérêt côté POO).
Et du coup c'est pas vraiment "synonyme" tongue
L'intérêt n'a absolument rien à voir avec la POO... T'as déjà codé en C avant ? wink
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

123

nan, le union en C++ est comme le union en C, c'est différent des struct et class

la différences, c'est que tu vas déclarer en struct un petit objet dans lequel tu ne vas pas t'embetter à mettre plein d'accesseurs vers les membres
par exemple
struct vector3 {
float x;
float y;
float z;
};

alors que pour une classe, qui convient aux objets plus gros, tu auras tendances à utiliser des méthodes pour modifier les variables membres

mais tout ça c'est une convention, mais ça permet d'utiliser les structs comme on les utilise en C
avatar

124

Folco (./121) :
Et union également, sauf que si j'ai bien lu, les éléments de la classe (et donc les attributs) sont alors publics par défaut (mais alors je vois pas trop l'intérêt côté POO).


non t'as mal lu, le union en c(++) superpose tous ses membres, pour accéder aux mêmes données de différentes manières

union u {
unsigned long int l;
unsigned char c[4];
};

si tu déclares

union u mavar;
et que tu fais u.c[0] = 0x42;

alors u.l vaudra soit 0x42000000 soit 0x00000042 selon le boutisme (tripo) du cpu.

125

squalyl -> ok ^^ Vivement que mon bouquin arrive (il a été expédié hier)
GoldenCrystal (./122) :
Bah, pourquoi ça serait nécéssairement mieux ? Si tu peux te passer de pointeurs, alors passe toi de pointeurs.

C'était pour comprendre la manipulation, pas dans le but d'implémenter quelque chose. J'en suis encore aux hello worlds hein, pas aux projets grin
GoldenCrystal (./122) :
L'intérêt n'a absolument rien à voir avec la POO

C'est bien ce qu'il me semblait.
GoldenCrystal (./122) :
T'as déjà codé en C avant ?

tongue

126

Un autre question, sur les opérateurs surchargés. Voici une classe de vecteurs, deux attributs {x,y} dimensionnant ces vecteurs, et un constructeur pour les initialiser directement :
class CVector {

    public:

    int x,y;

    CVector (){};

    CVector(int a, int b)
    {
        x = a;
        y = b;
    }

    CVector operator+ (CVector param)
    {
        CVector temp;
        temp.x = x + param.x;
        temp.y = y + param.y;
        return (temp);
    }
};

On utilise ça comme ça :
int main ()
{
  CVector a (3,1);
  CVector b (1,2);
  CVector c;
  c = a + b;
  cout << c.x << "," << c.y;
  return 0;
}

J'aurais voulu savoir comment s'écrirait la méthode pour surcharger l'opérateur +=.

Est-ce que c'est bon ?
    CVector operator+= (CVector param)
    {
        this->x += param.x;
        this->y += param.y;
        return *this;
    }

J'ai jamais rien fait avec this encore ^^ Je me dis que forcément, je dois merder. Désolé j'ose pas tester avant d'en savoir plus, je sais pas jusqu'où le bug serait intercepter, et j'ai pas envie de rebooter 25 fois avant d'y arriver xD

127

moi j'aurais plutot fait:

void operator+= (CVector param)
{
this->x += param.x;
this->y += param.y;
}


mais j'en sais vraiment pas plus que toi pour ce coup ^^

128

rebooter ?

Sinon, oui ça me semble bon.

(et si tu veux mon avis, la surcharge des opérateurs est rarement intéressante, sauf pour << et >>)
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. »

129

./127 Les deux sont possibles. Si on veut que l’opérateur += renvoie une valeur on peut utiliser la solution de Folco, sinon la tienne. Après on peut encore « optimiser » en passant les paramètres par référence…
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. »

130

ah oui c'est vrai.


je peux pas m'empêcher de trouver ça bordélique la surcharge d'opérateurs quand même sorry

131

Dans ton cas tu peux écrire ça:
    CVector operator+ (CVector param)
    {
        CVector temp;
        temp.x = x + param.x;
        temp.y = y + param.y;
        return (temp);
    }

Comme ça directement:
    CVector operator+ (CVector param)
    {
        return CVector(x + param.x, y + param.y);
    }

Le this n'est pas nécessaire s'il n'y a pas de confusion entre les membres et les variables locales. Par exemple:
void operator += (CVector param) {
    x += param.x;
    y += param.y;
}

Par contre:
void operator += (int x) {
    this->x += x;
}

Sinon les address error sont spécifiques au 68k, sur ARM par exemple ça va pas planter mais juste faire n'importe quoi 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

132

Sasume (./128) :
rebooter ?

Si ça plante grave, je me fais parfaitement confiance à ce niveau trioui

Mais sinon ça marche, sans planter, dans deux jours je suis un crack !!! trifouet
Sasume (./129) :
Après on peut encore « optimiser » en passant les paramètres par référenceâ&#x20AC;¦

Bien vu, mais je ne pense pas encore à ça. grin

Brunni ben oui je suis con, un 'this->truc' ou '(*this).truc' ou un 'truc' sont toujours équivalent à l'intérieur de la classe en fait ?

133

Oui, c'est équivalent. Fais juste gaffe à ne pas avoir de paramètres ou variables locales qui "cachent" les propriétés de la classe (de la même manière que pour les variables globales en fait).
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

134

Oki, et merci. happy

135

Folco (./132) :
Si ça plante grave, je me fais parfaitement confiance à ce niveau trioui.gif
Si t'y arrive sans être root/admin, faudra vite faire un bug report grin
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

136

HS:
A lire ce topic, je me réjouis de bosser en C# (le JAVA c'est kif-kif) : L'objet, t'es dedans dès la classe "main", donc tu t'y fais. Tant et si bien qu'après tu ne sais plus coder sans.

Et accessoirement, mais ça joue beaucoup quand même, Visual studio, c'est trop bon pour l'auto-complétion. J'ai beau avoir survolé Eclipse et Netbean en stage, ça n'a rien à voir, c'est mieux conçu: La "compilation à la volée" (corrigez moi si je me trompe) te propose uniquement les variables/méthodes "visibles" par la classe, pas les privates, ni toutes les méthodes accessibles. Bon OK, il ne le fait qu'en C#, pas en CPP. (J'ai l'espoir que ça change un jour, mais est-ce possible techniquement?)

Folco ne parle que de pointeurs, il ne fera donc pas les erreurs classiques du débutant (moi) qui commence l'Objet en venant du C : coller des static partout. Je pense qu'il est un de ses gars qui font de l'objet en C sans le savoir.

137

GUNNM (./136) :
Je pense qu'il est un de ses gars qui font de l'objet en C sans le savoir.

Ton avis est rassurant, mais je peux savoir pourquoi tu dis ça ?
En fait, le concept d'objet me plait beaucoup, même en assembleur j'écrivais des accesseurs à mes propres données (quand j'optimisais pas à mort en taille évidemment) : ça facilite la maintenance, quand tu modifies un type de donnée ou son emplacement. Par contre évidemment, ça restait de l'assembleur, ça va de soit.


ps :
ya plein de gros mots à propos de l'héritage multiple dans mon tuto :
class CRectangle: public CPolygon, public COutput;
class CTriangle: public CPolygon, public COutput;

embarrassed


ps2 -> aïe aïe aïe, j'en arrive aux membres virtuels, parait qu'il y a toute la quintessence de l'objet là-dedans, j'espère que j'va bien compris l'tuto eeek

138

Ton avis est rassurant, mais je peux savoir pourquoi tu dis ça ?
Je ne connais pas l'asm, et je ne pensais pas que c'était possible d'y faire de l'objet, mais c'est surtout que tu faisais du C de "haute voltige" avant (pour moi en tout cas: pointeur and co.), donc forcement un peu de POO, non?
D'ailleurs ça m'étonne: qu'entend tu par accesseurs? Le coté objet: rendre une variable publique, ou de pouvoir y accéder après quelques modif?
Sinon, le fait d'utiliser des Struct, ou n'as tu jamais fais de tableaux d'objets de différents types? 1er element un string, 2ème un double, etc. (Une classe quoi, enfin le début)

139

GUNNM> pour avoir un intellisense aussi bon en C++ qu'en C# je pense pas qu'il faille espérer.
j'(avais luq ue c'était pas trop possible parce que le C++ est vraiment merdique à parser parce que le sens d'une ligne est vachement dépendante du contexte, contrairement au C#
Par exemple "MaClasse monObjet(int monParamètre);" est-ce que c'est la déclaration d'un objet ou d'une fonction ?
avatar

140

C'est bien ce que je pensais.
Mais je me disais que si en C#, qui ne doit pas être si simple à parser efficacement, ils l'ont fait, peut être qu'ils pourront le faire en CPP. Cela dit, je me range à ton avis.

141

Si, j'ai utilisé des structures de données de différents types en C.
Par accesseur, j'entends par exemple le fait de lire, dans une structure, une donnée avec une fonction :
tyedef struct {int Abcisse, int Ordonnee, int Vitesse, int Acceleration} t_Perso;

Au lieu que mon perso lise Perso[2] pour se déplacer, je fais plutôt un
int Vitesse = GetVitesse(Perso);
avec int GetVitesse(t_Perso* Perso) {return Perso->vitesse;}

Ca permet de ne modifier que GetVitesse() le jour où tu modifies ta structure. Evidemment, l'exemple est grossier, mais c'est le principe.


Et sinon, je ne considère pas un quart de demi seconde avoir fait du C de haute voltige, je suppose que nos lecteurs on dû bien rigoler en te lisant, je suis un vrai débutant en C. grin Certains sont d'ailleurs très forts ici. Par contre, faire de l'assembleur m'a permis d'être à l'aise avec ce qu'est un pointeur, ça c'est clair. Parce que tu ne peux pas écrire une ligne d'asm sans pointeur, c'est nécessairement aussi familier que le type char pour n'importe quel programmeur.

142

[Mega cross, j'avais pas rafraichi la page sorry]
En fait y a 3 niveaux de codage en C ou ASM, prenons l'exemple d'un émulateur:
1) La manière bourrin, tout le monde voit les variables internes aux autres et s'amuse à les modifier. Ce modèle est peu souple et un bug peut potentiellement venir de n'importe où.
2) La manière "modulaire", avec des fichiers .c/.h organisés par entité du programme. Dans le cas du CPU, tu auras un fichier cpu.c et un cpu.h. Le cpu.c aura des fonctions exportées et accessibles par les autres (déclarées dans le .h) ainsi que des variables et fonctions qui lui sont propres (mot clé static). Les autres modules communiquent avec le CPU au travers de ces méthodes, à la manière d'un échange de messages, et la réaction du CPU aux messages est opaque (inconnue des autres à priori). Exemple: lcd.c veut lever une interruption => il appelle cpu_trigger_irq(INT_STAT) déclaré dans cpu.h au lieu de pendingIrqs |= INT_STAT avec pendingIrqs une variable interne du CPU.
Ce modèle est puissant car il est facile de maintenir les modules individuels et d'isoler des bugs, et fait du C un langage que je préfère au C++, mais il a le désavantage de ne permettre qu'une instance des entités en question (i.e. 1 CPU).
3) La manière "objet" qui est une extension du précédent pour avoir plusieurs CPUs par exemple. A ce moment cpu.h définit une structure représentant les variables d'état du CPU, et les fonctions prennent toutes cette structure en paramètre (i.e. il n'y a plus de variable "globale", statique ou pas, dans cpu.c). Si c'est ce que tu faisais jusque là, alors tu as mis un pas dans l'objet 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

143

GUNNM (./136) :
Et accessoirement, mais ça joue beaucoup quand même, Visual studio, c'est trop bon pour l'auto-complétion. J'ai beau avoir survolé Eclipse et Netbean en stage, ça n'a rien à voir, c'est mieux conçu: La "compilation à la volée" (corrigez moi si je me trompe) te propose uniquement les variables/méthodes "visibles" par la classe, pas les privates, ni toutes les méthodes accessibles.


Je suis surpris, parce que j'utilise Eclipse pour le PHP et qu'il gère bien la portée des variables (or j'ai quand même l'impression que le plug-in PHP est moins bien fignolé que celui pour le Java).
avatar

144

Visual Studio n'est pas très bon pour l'auto completion en C/C++ (même si ça reste le meilleur IDE pour ces langages que je connaisse). La base de données des symboles prend plus de 20 Mo sur un projet un conséquent et il faut un moment pour la reconstruire à la volée donc souvent tu ne vois pas immédiatement une variable ou méthode que tu viens de créer.
Eclipse en C ça ne fonctionne pas trop mal mais l'IDE n'est vraiment pas faite pour ça, et c'est pas pratique, en plus c'est extrêmement lourd.
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

145

Et NetBeans pour le C, du fidebaque ? cheeky

146

marche bien sans plus. Vaut mieux code blocks, pour moi.

147

Ok. J'ai d/l pour essayé, je resterai à CB tant que j'utilise pas Qt (j'y suis pas encore).

148

mais qt marche très bien avec codeblocks !

149

Sûrement. Mais leur IDE + Qt Creator n'est-elle pas plus sympa si on utilise Qt ?

De toute façon, une fois que j'aurai fini d'apprendre le langage de façon scolaire (évidemment grin), je ferai un projet m'obligeant à penser objet, mais en console, histoire de ne pas faire de l'objet parce que l'api que j'utilise oblige à passer par là. Bref, on en reparlera. Mais je commencerai avec CB, qui me plait bien pour le moment.

150

leur IDE = ?
Sinon, oui, QtCreator est intéressant quand tu utilises Qt.
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. »