2016-12-15 2 views
0

faire des actions au hasard dans un jeu lui donne une apparence vraiment réel ... donc si un personnage a beaucoup capabilities comme move, work, study ... donc dans la programmation une fonction de ceux-ci est appelée en fonction de certaines conditions. ce que nous voulons est une action plus aléatoire et réelle comme si aucune condition n'est là mais en fonction d'une condition aléatoire le caractère prend une action aléatoire ..appelant la fonction en fonction de l'indice de tableau de tableau de noms de fonctions

Je pensais faire des actions (fonctions) dans un tableau puis déclarer un pointeur de fonction et le programme peut générer au hasard un indice sur lequel le pointeur de fonction sera attribué le nom de la fonction correspondante du tableau:

#include <iostream> 

void Foo() { std::cout << "Foo" << std::endl; } 
void Bar() { std::cout << "Bar" << std::endl; } 
void FooBar(){ std::cout << "FooBar" << std::endl; } 
void Baz() { std::cout << "Baz" << std::endl; } 
void FooBaz(){ std::cout << "FooBaz" << std::endl; } 


int main() 
{ 

    void (*pFunc)(); 
    void* pvArray[5] = {(void*)Foo, (void*)Bar, (void*)FooBar, (void*)Baz, (void*)FooBaz}; 

    int choice; 
    std::cout << "Which function: "; 
    std::cin >> choice; 
    std::cout << std::endl; 

    // or random index: choice = rand() % 5; 

    pFunc = (void(*)())pvArray[choice]; 
    (*pFunc)(); 


    // or iteratley call them all: 

    std::cout << "calling functions iteraely:" << std::endl; 

    for(int i(0); i < 5; i++) 
    { 
     pFunc = (void(*)())pvArray[i]; 
     (*pFunc)(); 
    } 

    std::cout << std::endl; 
    return 0; 
} 
  • le programme fonctionne très bien, mais je n'est bon ou il y a une alternative. chaque commentaire est le bienvenue

Répondre

3

Il n'y a absolument aucun point dans la conversion des pointeurs de fonction à void* et vice versa. Définissez un tableau de pointeurs de fonction et utilisez-le comme un tableau normal. La syntaxe de la déclaration est décrite dans this Q&A (c'est pour C, mais la syntaxe reste la même en C++). La syntaxe de l'appel est une application simple () après l'indexeur [].

void (*pFunc[])() = {Foo, Bar, FooBar, Baz, FooBaz}; 
... 
pFunc[choice](); 

Demo.

Note: Bien que pointeurs de fonctions de travail en C++, une approche plus souple est d'utiliser std::function objets à la place.

+0

@asblinkenlight: une dernière question: pourquoi je dois fournir la taille du tableau 'void (* ptrFunc [5])();' si je le définis plus tard? ou je dois initialiser pendant la déclaration: comme dans votre exemple: 'void (* pFunc [])() = {Foo, Barre, FooBar, Baz, FooBaz};' ​​sinon erreur: 'void (* pFunc [])(); '? – Raindrop7

+1

@ Raindrop7 C++ a toujours besoin de la taille. Vous pouvez soit le fournir explicitement, soit laisser le compilateur le déterminer pour vous à partir de l'initialiseur. – dasblinkenlight

+0

oui c'est comme n'importe quel tableau où soit l'initialiser sans dire explicitement la taille ou juste le déclarer mais en fournissant la taille – Raindrop7