Je suis nouveau en C ++. J'essaie de faire un bouton cliquable avec OpenGL. Je travaille pour ajouter une fonction de rappel pour chaque bouton pendant 2 jours, j'ai essayé de nombreuses méthodes que j'ai trouvées mais je ne peux pas faire cela. Mes codes ci-dessous donnent une erreur de mémoire. Où est mon erreur?
main.h strong> em> p> main.cpp < / strong> em> p>
3 Réponses :
Votre Createmember code> ne fonctionne pas comme vous vous attendez.
Button::Button(pointerFunction f) : callback (f) {
// ...
Button::Buttons.push_back(*this);
}
void createMember() {
Button classMember (testFunction);
}
int main() {
createMember ();
for (Button& button : Button::Buttons) {
std::cout << button.value; // I can access this value.
button.callback(); // But here is give memory error!
}
}
Dans cette fonction
void createMember() { Button classMember; Button::Buttons.back().setCallBack(&testFunction); }
Votre erreur est que vous créez un objet local, appuyez sur la copie dans le vecteur, mettez l'adresse de rappel à l'objet d'origine, puis détruisez l'objet d'origine. Eh bien, vous pouvez mettre l'adresse de rappel comme l'argument du constructeur, puis la copie l'aurait. mais je recommanderais d'ajouter une fonction statique à la classe de boutons qui est responsable de la création d'une Objet du bouton et renvoiez-vous. Ceci élimine également la création / la suppression inutile des objets temporaires. P> #include <iostream>
#include <vector>
class Button {
public:
// Storage Vector
static std::vector<Button> Buttons;
// typedef Function
typedef void (*pointerFunction)();
// Constructor
Button(/*Parameters*/);
// Setting Callback
void setCallBack(void(*function)());
// Callback pointer
pointerFunction callback;
template<class... U>
static Button& createButton(U&&... u) {
return Buttons.emplace_back(std::forward<U>(u)...);
}
int value{ 4 };
};
std::vector<Button> Button::Buttons;
Button::Button(/*Parameters*/) {
// ...
Button::Buttons.push_back(*this);
}
void Button::setCallBack(void(*function)()) {
this->callback = function;
this->callback(); // Here is work!
}
void testFunction() {
std::cout << "Test\n";
}
void createMember() {
auto &classMember = Button::createButton(/**/);
//Button classMember;
classMember.setCallBack(&testFunction);
}
int main() {
createMember();
for (Button& button : Button::Buttons) {
std::cout << button.value;
button.callback();
}
return 0;
}
S'il vous plaît n'ajoutez pas de "problème résolu" à la question. Au lieu de cela, marquez la réponse qui a résolu votre problème comme accepté.