Bonjour a tous, je cree pour un project un constructeur de fenetre ce constructeur poscede un vector m_tabButton qui contient des Button ,les Button sont des Object tous heritter de Button . Avec la SFML j'ai cree une fonction draw pour afficher les Button qui est virtuel cependant dans ma class fenetre au moment de draw le TextButton,ShapeButton,ImageButton (qui herite de Button) appel la fonction draw de Button et non la leur voici 2 draw dans Button.cpp avec TextButton qui herite de Button dans le .h
Tu n'as pas l'air de stocker des pointeurs dans ton tableau de boutons ce qui signifie probablement que tu as du slicing, et en tout cas pas de polymorphisme.
Montre tes headers, on n'a pas assez d'infos, là (notamment les déclarations de tes types de boutons, et la déclaration de ce tableau de boutons).
- Edité par dragonjoker 17 août 2023 à 11:07:08
Si vous ne trouvez plus rien, cherchez autre chose.
Donc c'est bien ça, tu as du slicing dû à la non utilisation de pointeurs pour tes boutons.
Pour pouvoir utiliser le polymorphisme (stocker des objets de la classe mère en utilisant le comportement spécialisé dans les classes filles), il faut stocker des pointeurs de classe mère, et du coup il faut que ton tableau soit déclaré comme suit : std::vector<std::unique_ptr<Button>> m_tabButton;
Et du coup créer tes boutons en utilisant std::make_unique<ClasseFilleDeButton>(paramètres de construction)
- Edité par dragonjoker 17 août 2023 à 13:28:12
Si vous ne trouvez plus rien, cherchez autre chose.
merci , cette solution permet de regler le probleme de polymorphisme sur la fonction draw, cependant j'ai un nouveau probleme dans la fonction update de ma fenetre (la fonction est introuvable pour le compilateur)
void Fenetre::update()
{
for (auto& object : m_tabButton)
{
if (*object.getCollision(m_positionSouris)) //erreur ici
{
*object.update(); //erreur ici
}
}
}
voici getPosition et update pour TextButton ( les 2 fonction sont virtual)
Quel type de soucis as-tu au moment de la création du bouton ?:
- Erreur ou avertissement du compilateur (dans ce cas dis-le nous).
- Erreur à l' exécution (de segmentation (sigsegv) ) ou autre.
Plus tu donneras d' information, plus tu auras d'aide précise pour cerner le problème.
voicie le message du compilateur :
GravitéCodeDescriptionProjetFichierLigneÉtat de la suppression
Erreur (active)E0304aucune instance de fonction surchargée "std::vector<_Ty, _Alloc>::push_back [avec _Ty=std::unique_ptr<Button, std::default_delete<Button>>, _Alloc=std::allocator<std::unique_ptr<Button, std::default_delete<Button>>>]" ne correspond à la liste d'argumentsSFML..\src\Fenetre.cpp56
j'ai trouver une solution en faisant directement heriter la class de Button
Avant :
class TextButtonShape : public TextButton, public ShapeButton
{
public:
//...
protected :
// ...
};
apres :
class TextButtonShape : public Button, public TextButton, public ShapeButton
{
public:
//...
protected :
// ...
};
je n'ai pas vraiment compris pourquoi cela fonctionne en heritant directement de Button
mais cette solution ne cree aucun probleme si vous avez une explication ou une meilleur
Plus tu donneras d' information, plus tu auras d'aide précise pour cerner le problème.
voicie le message du compilateur :
GravitéCodeDescriptionProjetFichierLigneÉtat de la suppression
Erreur (active)E0304aucune instance de fonction surchargée "std::vector<_Ty, _Alloc>::push_back [avec _Ty=std::unique_ptr<Button, std::default_delete<Button>>, _Alloc=std::allocator<std::unique_ptr<Button, std::default_delete<Button>>>]" ne correspond à la liste d'argumentsSFML..\src\Fenetre.cpp56
je n'ai pas vraiment compris pourquoi cela fonctionne en heritant directement de Button
mais cette solution ne cree aucun probleme si vous avez une explication ou une meilleur
methode je suis prenneur
Comment veux-tu qu'on te dise quelque chose à propos d'un message d'erreur du compilateur si tu ne nous montres pas le code correspondant (Fenetre.cpp ligne 56, sans doute) ?
- Edité par michelbillaud 19 août 2023 à 12:34:23
Utilisation de la bonne fonction draw
× 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.
Si vous ne trouvez plus rien, cherchez autre chose.
Mon site web de jeux SDL2 entre autres : https://www.ant01.fr