0
votes

Pointeur de fonction avec vecteur

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 xxx

main.cpp < / strong> xxx


1 commentaires

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é.


3 Réponses :


1
votes

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!
    }
}


0 commentaires

2
votes

Dans cette fonction

void createMember() {
    Button classMember;
    Button::Buttons.back().setCallBack(&testFunction);
}


0 commentaires

0
votes

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. XXX PRE>

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;
}


0 commentaires