Il modo migliore per avere un puntatore a diversi metodi - richiesta la critica

2

Sto iniziando con una breve introduzione di ciò che conosco dal linguaggio C:

  • un puntatore è un tipo che memorizza un indirizzo o un NULL
  • l'operatore * legge il valore sinistro della variabile alla sua destra e usa questo valore come indirizzo e legge il valore della variabile a quell'indirizzo
  • l'operatore & genera un puntatore alla variabile alla sua destra

Quindi pensavo che in C ++ i puntatori possono funzionare anche in questo modo, ma ho sbagliato. Per generare un puntatore a un metodo statico devo fare questo:

#include <iostream>

class Foo{
    public:
    static void dummy(void){ std::cout << "I'm dummy" << std::endl; };
};

int main(){
    void (*p)();
    p = Foo::dummy; // step 1
    p();
    p = &(Foo::dummy); // step 2
    p();
    p = Foo; // step 3
    p->dummy();
    return(0);
}

Ora ho diverse domande:

  • Perché funziona il passaggio 1?
  • Perché funziona anche il passaggio 2? Sembra un "puntatore al puntatore" per me, molto diverso dal punto 1.
  • Perché il terzo passo è l'unico che non funziona ed è l'unico che mi sembra ragionevole, sinceramente?
  • Come posso scrivere una serie di puntatori o un puntatore sulla struttura dei puntatori per memorizzare metodi (statici o non statici di oggetti reali)?
  • Qual è la migliore sintassi e lo stile di codifica per generare un puntatore a un metodo?
posta user827992 23.06.2012 - 22:31
fonte

2 risposte

12

what is the best syntax and coding style for generating a pointer to a method?

Non farlo. Utilizza std::function<void()> .

Ora, sui gradini. Il passaggio 1 è tecnicamente illegale, ma il compilatore lo ha consentito implicitamente prendendo l'indirizzo per te. Il passaggio 2 è come dovrebbe essere fatto. Il nome di una funzione statica (in questo caso, Foo::dummy ) è una funzione lvalue e deve avere il suo indirizzo considerato come C ++ legale e fornire un puntatore a funzione.

Il passaggio 3 semplicemente non ha alcun senso. Stai cercando di assegnare ... un puntatore a una funzione di runtime ... a un tipo? Questo non ha assolutamente senso. E poi provi ad accedere ... a un membro ... di un puntatore a funzione? Non calcola.

Ci sono due parti per la risposta "Che cosa faccio quando voglio X in C ++?". La prima parte, solo per i veterani C, è "Dimentica tutto ciò che pensi di aver imparato in C". La seconda parte riguarda X.

how can i write an array of pointers or a pointer to pointers structure to store methods ( static or non-static from real objects )

std::vector<std::function<void()>> arr;

le done.

    
risposta data 23.06.2012 - 22:47
fonte
-1

what is the best syntax and coding style for generating a pointer to a method?

Secondo il paragrafo C ++ Faq lite su " Puntatori alle funzioni membro ", in generale si dovrebbe usare un typedef per creare il puntatore e una macro quando chiamando la funzione membro (punti 33.5 e 33.6 rispettivamente).
Ciò rende più semplice chiamare il metodo su un dato oggetto.

Nel tuo esempio stai usando un metodo statico, quindi non hai bisogno di un oggetto per chiamarlo.
Tuttavia, ecco come appare il tuo codice seguendo questi consigli, quando si chiama una funzione membro non statico:

// define the macro to use pointer to methods
#define CALL_MEMBER_FN(object,ptrToMember)  ((object).*(ptrToMember))

class Foo{
    public:
    void dummy1(void){ std::cout << "I'm dummy 1" << std::endl; };
    void dummy2(void){ std::cout << "I'm dummy 2" << std::endl; };
};

int main(){
    // define the PointerToFooMember type. Note that you can use it for dummy1 and dummy2 as well
    typedef void(Foo::*PointerToFooMember)();
    PointerToFooMember ptr = &Foo::dummy1;

    // create an object to call the method later
    Foo foo;

    // call the method
    CALL_MEMBER_FN(foo, ptr)();
}
    
risposta data 24.06.2012 - 04:54
fonte

Leggi altre domande sui tag