J'ai un petit problème avec mon programme que je n'arrive vraiment pas à résoudre ( dont voici les différentes parties de code ) :
Vaisseau.h
[...]
class Vaisseau
{
protected:
sf::Texture texture;
sf::Sprite sprite;
string filename;
float x;
float y;
int pv;
int atqSpeed;
float speed;
float shootTime;
Attaque* atq;
int indiceAtq;
[...]
Vaisseau.cpp
[...]
// Fonctions de transformations
void Vaisseau::setTexture()
{
sprite.setTexture(texture);
sprite.setPosition(x,y);
atq = new Attaque[10];
atq[0] = Atq1();
atq[0].setTextureProj("Projectile/Projectile.png"); // A changer si texture de projectile différentes
atq[1] = Atq2();
atq[1].setTextureProj("Projectile/Projectile2.png"); // A changer si texture de projectile différentes
}
Quand j'assigne à la position 0 du tableau atq la méthode constructice Atq1() ( I.e atq[0] = Atq1(); ), je reçois toujours l'affichage
"On se trouve dans Attaque"
Hors j'aimerais pouvoir utiliser la fonction initAtq() qui se trouve dans Atq1() et non celle de Attaque().
J'ai vu que c'était une question de polymorphisme ( avec des virtual a mettre dans le header de Attaque() ).
Il faut également un pointeur ou une référence pour pouvoir appliquer le polymorphisme hors ici je ne comprends pas pourquoi cela ne fonctionne pas
J'ai bien essayé une autre manière de déclarer mon tableau atq :
Vaisseau.cpp
[...]
//Fonctions de transformations
void Enemi::setTexture()
{
sprite.setTexture(texture);
sprite.setPosition(x,y);
Attaque* atq[] = {new Atq1, new Atq2};
atq[0]->setTextureProj("Projectile/Projectile2.png"); // A changer si texture de projectile différentes; // A changer si texture de projectile différentes
atq[1]->setTextureProj("Projectile/Projectile2.png"); // A changer si texture de projectile différentes; // A changer si texture de projectile différentes
}
Mais dans ce cas j'obtiens une erreur de Segmentation :
Program received signal SIGSEGV, Segmentation fault.
0x0000555555560c84 in std::vector<Projectile, std::allocator<Projectile> >::size() const ()
( qui apparemment viendra de mon fichier Attaque.h qui contient l'élément vector<Projectile> projectiles; )
Est ce que vous auriez des pistes a me donner ? Ca va faire une semaine que je bloque la dessus je ne trouve aucune solution.
( le but étant de pouvoir affecter des attaques différentes a mon vaisseau )
> J'ai vu que c'était une question de polymorphisme ( avec des virtual a mettre dans le header de Attaque() ). > Il faut également un pointeur ou une référence pour pouvoir appliquer le polymorphisme hors ici je ne comprends pas pourquoi cela ne fonctionne pas.
Ben tu as pourtant la réponse : il te faut soit un tableau de pointeurs (pas bruts, hein ! std::unique_ptr est ton ami), soit un tableau de références. Sinon tu as un bon gros slicing des familles : tes Atq1 et Atq2 sont stockés en tant que Attaque, et perdent alors leurs informations propres (dont leur vtable).
Pour ton crash, le debugger est ton ami (ou alors fournis nous une call stack complète)
Si vous ne trouvez plus rien, cherchez autre chose.
> J'ai vu que c'était une question de polymorphisme ( avec des virtual a mettre dans le header de Attaque() ). > Il faut également un pointeur ou une référence pour pouvoir appliquer le polymorphisme hors ici je ne comprends pas pourquoi cela ne fonctionne pas.
Ben tu as pourtant la réponse : il te faut soit un tableau de pointeurs (pas bruts, hein ! std::unique_ptr est ton ami), soit un tableau de références. Sinon tu as un bon gros slicing des familles : tes Atq1 et Atq2 sont stockés en tant que Attaque, et perdent alors leurs informations propres (dont leur vtable).
Pour ton crash, le debugger est ton ami (ou alors fournis nous une call stack complète)
Merci beaucoup pour ta réponse, j'essaye la solution du tableau de pointeurs avec unique_ptr et je reviens pour donner des nouvelles !
EDIT :
Je viens de me rendre compte d'un détail :
Quand on utilise std::unique_ptr, on doit renseigner le Type, mais vu que dans mon cas ce sont des types Atq1(), Atq2(), etc.. qui hérite de Attaque(), ca ne va pas poser de problèmes pour la déclaration ?
D'ailleurs mon erreur dans l'execution de mon programme ( et juste a l'execution ) c'est :
Program received signal SIGSEGV, Segmentation fault.
0x0000555555560fcc in std::vector<Projectile, std::allocator<Projectile> >::size (this=0x160) at /usr/include/c++/8/bits/stl_vector.h:806
806 { return size_type(this->_M_impl._M_finish - this->_M_impl._M_start); }
(std::unique_ptr n'est PAS fait pour les tableaux, std::vector est fait pour les tableaux à dimension dynamique, std::array pour les tableaux à dimension statique)
- Edité par dragonjoker 22 octobre 2019 à 10:48:30
Si vous ne trouvez plus rien, cherchez autre chose.
Berk : les variables protected c'est pas propre. Si tu dois éventuellement rendre quelque chose protected, c'est des fonctions membres et pas des variables.
A cela s'ajoute que tu ne sépares pas la notion d'affichage de la notion de modèle dans ton jeu. Tu devrais avoir deux éléments distincts : le vaisseau tel que tu en as besoin dans le jeu pour effectuer les différentes actions, etc ; et la représentation graphique d'autre part, qui sert juste à effectuer les affichages et n'a pas besoin de connaître autre chose d'un vaisseau que sa position et éventuellement son état.
Jamais de fonction "init" dans une classe. Le rôle d'initialiser c'est celui du constructeur et de personne d'autre.
Es tu sûr d'avoir besoin de faire varier ta classe "Attaque" ? (Et donc de créer des héritages). De l'extérieur, ça ne semble pas, on a plutôt l'impression que tu ne cherches qu'à faire varier les données internes (or, un héritage est fait pour faire varier le comportement des fonctions, pas juste les données), et dans ce cas, juste changer les paramètres de construction est plus simple et plus clair.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Si vous ne trouvez plus rien, cherchez autre chose.
(std::unique_ptr n'est PAS fait pour les tableaux, std::vector est fait pour les tableaux à dimension dynamique, std::array pour les tableaux à dimension statique)
Si vous ne trouvez plus rien, cherchez autre chose.
Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C