C ++ appelle une fonction d'un vecteur de pointeurs de fonction dans une classe où la définition de la fonction est dans le principal
Bien, dans mon main j'ai:
void somefunction();
int main()
{
//bla bla bla
SomeClass myclass = SomeClass();
void(*pointerfunc)() = somefunction;
myclass.addThingy(pointerfunc);
//then later i do
myclass.actionWithDiffrentOutcomes();
}
void somefunction()
{
//some code
}
et dans la classe:
class SomeClass()
{
public:
void addThingy(void (*function)());
void actionWithDiffrentOutcomes();
private:
std::vector<void (**)()> vectoroffunctions;
}
SomeClass::addThingy(void (*function)())
{
vectoroffunctions.push_back(&function);
}
SomeClass::actionWithDiffrentOutcomes()
{
(*vectoroffunctions[0])();;
}
Je suis une sorte de nouvelle-ish pour les pointeurs, mais j'ai lu sur mon c++ livres, googlé, ext. et cela semble correct, compile, lance mais quand je l'appelle "actionWithDiffrentOutcomes()" je reçois une violation d'accès. Je ne suis pas sûr de quoi faire. il semble correct, mais quelque chose qui est évidemment faux. Alors, comment puis-je appeler une fonction dans une classe lors de la définition est dans un autre?
Je suis en train de faire de cette façon parce que je ne peux pas coder en dur chaque option dans une instruction switch.
source d'informationauteur Steven Venham
Vous devez vous connecter pour publier un commentaire.
Votre code est presque correct. Votre vecteur est à tort la tenue des pointeurs de pointeurs de fonctions plutôt que de simplement les pointeurs de fonctions.
addThingy
est l'ajout de l'adresse de l'function
pointeur dans lavector
mais le pointeur est hors de portée dans la ligne suivante.Modifier votre code comme suit:
Aussi, vous avez beaucoup d'erreurs de syntaxe dans le reste du code qui doit arrêter le code de la même compilation.
Le problème est ici:
Vous êtes en train d'ajouter l'adresse de l' local variable. La variable locale est détruite une fois que vous êtes de retour de la fonction. L'adresse à laquelle le vecteur des magasins de points d'un objet détruit c'est pourquoi vous obtenez "violation d'accès" erreur lors de l'exécution.
Pour résoudre ce problème, faites ceci:
Premier changement de cette
:
qui est pratiquement la même chose que:
Maintenant le faire:
De la rendre plus souple, vous pouvez utiliser un modèle avec
std::function
:Maintenant, vous pouvez l'utiliser pour stocker des fonctions ainsi que les foncteurs:
De sortie (Démo En Ligne):
Espère que ça aide.
Pointeurs de fonction sont beaucoup plus lisible avec
typedefs
:Vous pouvez déclarer
addThingy()
comme ceci:Et
vectoroffunctions
comme suit:La définition de
addThingy
sera:Et votre
main()
ressemblerait plus à:Beaucoup moins de
*
s et&
s avec qui faire des erreurs!