2017-08-02 3 views
0

Le code ci-dessous provient de LevelDB. Je donne deux blocs de code pour une meilleure compréhension. Je suis incapable de comprendre ce qui se passe. ThreadState est une structure et j'ai écrit ici pour le rendre facile pour le lecteur.LevelDB --- Code en C++

struct ThreadState { 
    int tid;    // 0..n-1 when running in n threads 
    Random rand;   // Has different seeds for different threads 
    Stats stats; 
    SharedState* shared; 

    ThreadState(int index) 
     : tid(index), 
      rand(1000 + index) { 
    } 
    }; 

Le code marqué ci-dessous est-il une instanciation d'objet de classe Benchmark? Que se passe-t-il dans le code marqué ci-dessous?

void Run() { 
     PrintHeader(); 
     Open(); 

     const char* benchmarks = FLAGS_benchmarks; 
     while (benchmarks != NULL) { 
     { 
      //code ommitted 
     } 

     // Reset parameters that may be overriddden bwlow 

     ***void (Benchmark::*method)(ThreadState*) = NULL;*** // What does this code line mean? // Benchmark is a class. 

     bool fresh_db = false; 
     int num_threads = FLAGS_threads; 

     if (name == Slice("fillseq")) { 
      fresh_db = true; 
      method = &Benchmark::WriteSeq; 
     } 

Si nécessaire, je peux aussi donner une implémentation détaillée de Benchmark.

Merci beaucoup pour votre aide!

Répondre

1
void (Benchmark::*method)(ThreadState*) = NULL; 
// What does this code line mean? 
// Benchmark is a class. 

Ce qui précède est un pointeur sur une fonction membre. Puisque les fonctions membres ne sont pas comme des fonctions régulières (elles ne peuvent être appelées que sur un objet valide), vous ne pouvez pas prendre leur adresse de la même façon que pour une fonction libre.

Par conséquent, la syntaxe ci-dessus est introduite. Il est similaire à un pointeur de fonction normal, à l'exception du spécificateur de classe Benchmark::. C'est essentiellement le type du pointeur implicite this.

Dans votre cas, method est un pointeur vers une fonction membre prenant ThreadState* en tant que paramètre et ayant un type de retour void. La raison de l'utiliser est probablement de simplifier l'appel. Tout d'abord, et en fonction de divers paramètres, une fonction membre est appelée pour être appelée, et son "adresse" est enregistrée dans method. Une fois toutes les vérifications effectuées, il n'y a qu'un seul appel à la fonction choisie via le pointeur sur member. Par ailleurs, &Benchmark::WriteSeq est la façon dont le code obtient "l'adresse" de la fonction membre WriteSeq. Vous devez utiliser l'opérateur address-of sur le nom de la fonction qualifiée.

+0

Merci beaucoup pour votre réponse. Cela m'a beaucoup aidé. Seulement si la vie était aussi bonne que stackoverflow !! –

+0

@NewUser - Heureux d'aider :) – StoryTeller