je pense qu'en procedurale, il y aura moins de lignes ..
C'est faux

, je code aussi régulièrement en c++ , et y a pas photo , la poo facilite pas mal les choses , rend un code beaucoup plus "humain"
après pb n'est pas fait pour la poo, c'est tout , on peut en faire , mais c'est crado
exemple en pseudo c++ :
une classe mère de dessin par exemple,
cette classe est générique , elle ne peut être utilisé directement à cause de sa méthode virtuelle de rendu, il faudra implémenté la fonction de dessin dans les classes filles, les classes filles auront accès aux membres public et protected.
class Dessin
{
public:
/*constructeur , on initialise ce que tu veut dedans*/
Dessin()
{
nom = "il sera redefini dans les classes filles";
}
float position_x;
float position_y;
virtual void rendu() = 0;
protected:
std::string nom;
};
Voici une classe fille :
class Triangle: public Dessin
{
public:
Triangle()
{
nom = "je suis un triangle";
}
void rendu()
{
std::cout << nom << std::endl;
}
};
Triangle hérite de toute sa classe mère , on à redéfini la fonction de rendu car la classe mère avait une méthode virtuelle
en voila deux autres :
class Rond: public Dessin
{
public:
Rond()
{
nom = "je suis un rond";
}
void rendu()
{
std::cout << nom << std::endl;
}
};
class Dobro: public Dessin
{
public:
Dobro()
{
nom = "je suis dobro !";
}
void rendu()
{
std::cout << nom << std::endl;
}
};
on à donc 3 objets différents un Rond , un Triangle , et un Dobro
chaque objet on leurs propres attribut ( ici le nom ) et chaque objet possède une méthode de rendu.
on va créer une liste qui va contenir nos objets , on va prendre un conteneur du type std::vector qui est une liste chainée :
std::vector<Dessin*> maListe;
on construit nos objets en appelant les constructeurs :
Rond * monRond = new Rond();
Triangle * monTriangle = new Triangle();
Dobro * monDobro = new Dobro();
une des forces de la poo , c'est que nos objets sont différents , mais il tiendrons tous dans le vector :
maListe.push_back(monRond);
maListe.push_back(monTriangle);
maListe.push_back(monDobro);
et on parcour la liste pour le rendu :
std::vector<Dessin*>::iterator it;
for(it = maListe.begin(); it < maListe.end(); ++it)
{
Dessin * element = *it;
element->rendu();
}
évidement c'est bateau comme exemple , met toi au c++ , et regarde comment est fait par exemple la sfml 2.0 , reagarde pour un sprite sfml 2.0 :
sf::Drawable est une classe qui gère tout ce qui s'affiche , un sprite , un texte , une forme ( sf::Shape sous sfml ) , sf::Sprite hérite aussi de sf::Transformable
qui gère lui tout ce qui concerne les transformations , pour le gars qui utilise le sprite , il n'a pas à ce soucié de comment est affiché le sprite , comment la transformation est faite, etc... il en fait abstraction ! il n'utilise que le sprite , point barre.
sinon voila le code source de mon exemple du haut :
Code : Tout sélectionner
#include <iostream> // pour cout
#include <vector> // pour la LL
class Dessin
{
public:
/*constructeur , on initialise ce que tu veut dedans*/
Dessin()
{
nom = "il sera redefini dans les classes filles";
}
float position_x;
float position_y;
virtual void rendu() = 0;
protected:
std::string nom;
};
class Triangle: public Dessin
{
public:
Triangle()
{
nom = "je suis un triangle";
}
void rendu()
{
std::cout << nom << std::endl;
}
};
class Rond: public Dessin
{
public:
Rond()
{
nom = "je suis un rond";
}
void rendu()
{
std::cout << nom << std::endl;
}
};
class Dobro: public Dessin
{
public:
Dobro()
{
nom = "je suis dobro !";
}
void rendu()
{
std::cout << nom << std::endl;
}
};
int main()
{
std::vector<Dessin*> maListe;
Rond * monRond = new Rond();
Triangle * monTriangle = new Triangle();
Dobro * monDobro = new Dobro();
maListe.push_back(monRond);
maListe.push_back(monTriangle);
maListe.push_back(monDobro);
std::vector<Dessin*>::iterator it;
for(it = maListe.begin(); it < maListe.end(); ++it)
{
Dessin * element = *it;
element->rendu();
}
}
pour compilé :
g++ main.cpp -o main.exe