Dubbio su metodi statici

oleg.fresi
Lavorando nella mia classe dado in c++ ho definito in un file cpp di implementazione una funzione static che restituisce il numero di dadi chiamati, poi in un altro file nel main ho scritto questo comando:
cout<<"Dadi creati:"<<Dado::dadiCreati<<endl;


L'unica cosa è che dopo aver chiamato la funzione dadiCreati ho dimenticato le (), però il compilatore non mi ha dato segno di errore ma ha stampato un numero casuale. Perchè questo?

Risposte
Super Squirrel
Se posti il codice completo possiamo fornirti una risposta precisa, altrimenti dovrai accontentarti di qualche supposizione.

claudio862
"olegfresi":
Lavorando nella mia classe dado in c++ ho definito in un file cpp di implementazione una funzione static che restituisce il numero di dadi chiamati, poi in un altro file nel main ho scritto questo comando:
cout<<"Dadi creati:"<<Dado::dadiCreati<<endl;


L'unica cosa è che dopo aver chiamato la funzione dadiCreati ho dimenticato le (), però il compilatore non mi ha dato segno di errore ma ha stampato un numero casuale. Perchè questo?


Il valore di una funzione (non di una chiamata a funzione, ma della funzione stessa) è identico al suo indirizzo. Avresti potuto scrivere "& Dado::dadiCreati" e sarebbe stata la stessa cosa.

Il motivo per cui una funzione (e non solo una chiamata) può essere risultato di un'espressione è che così puoi assegnarla a una variabile per esempio per usare funzioni di ordine superiore.

#include <iostream>

class A
{
public:
    static void static_function(){
        std::cout << "Dentro la classe A" << '\n';
    };
};

void free_function()
{
    std::cout << "Dentro una funzione libera" << '\n';
}

int main()
{
    // Assegno a una variabile
    void (*function_variable)() = A::static_function;
                               // & A::static_function

    // Chiamo la variabile
    function_variable();

    // Assegno ancora
    function_variable = free_function;
                     // & free_function

    // Chiamo la variabile
    function_variable();
}

oleg.fresi
Ahh, ora si che ho capito, grazie mille per l'aiuto!!

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.