2013-07-29 16 views
8

Come si chiama un oggetto funzione da se stesso? Sembra che non possa usare this. Esempio:Richiamare in modo ricorsivo un oggetto funzione

class factorial { 
    public: 
    int operator()(int n) { 
    if (n == 0) 
     return 1; 
    return n * ??(n-1); 
    } 
}; 

Che posto a ???

+8

E a proposito di '(* this)'? – dyp

+4

Inoltre, 'this-> operator() (n-1);' – jrok

+0

@Borgleader: Sta seguendo uno schema di funzionamento, che richiede un operatore non '' ''()() '). Non è sempre utile aggiungere modificatori come 'static' solo perché è possibile, per questa particolare versione di questo particolare functor. –

risposta

13
#include <iostream> 

class factorial { 
public: 
    int operator()(int n) { 
    if (n == 0) 
     return 1; 
    return n * (*this)(n-1); 
    } 
}; 

int main() 
{ 
    std::cout << factorial()(5) << std::endl; 
} 

Funziona bene per me. Live example.

+0

grazie, funziona. –

4

Come indicato in DyP, è possibile chiamare (*this)(n-1). Tuttavia, è strano leggere, quindi sarebbe meglio dividerlo in un metodo separato calculate_factoral e chiamarlo invece invece

+3

Se vuoi dare un nome più bello a '* this', allora una variabile di riferimento locale dovrebbe essere adeguata. per esempio. 'fattoriale & recurse = * this; return n * recurse (n-1); 'Ciò che non puoi fare è spostarlo in una funzione separata chiamata' factorial', poiché ciò avrebbe un conflitto di nomi con un costruttore. –

+0

@ Ben - grazie, ho perso il fatto che questa classe è stata anche chiamata fattoriale! – Sean

0

fattoriale sicuramente?

So solo Java e un fattoriale ricorsiva può essere scritta come:

public class Factorial{ 

    public int factorial(int n) { 
     return (n > 1) ? n * factorial(n-1) : 1; 
    } 
} 

presumo lo stesso principio si applica.

+3

Ma la funzione non è chiamata 'fattoriale'; è un sovraccarico di 'operator()'. –

+3

Purtroppo sapere che Java non ti ha dato alcuna esperienza con l'overloading dell'operatore, che è centrale in questa domanda. –

+0

a destra, scrivere una funzione era semplice; Stavo testando oggetti funzionali/sovraccarico dell'operatore qui. –

2

Come molti hanno sottolineato, è sufficiente utilizzare la sintassi (*this)(n - 1). Ma questa sintassi non è esattamente intuitiva e una soluzione leggermente migliore potrebbe essere quella di scomporre l'effettiva implementazione in un altro metodo chiamato.

class factorial { 
public: 
    int operator()(int n) { 
    return impl(n); 
    } 
private: 
    int impl(int n) { 
    // actual work here 
    } 
}; 
9

È possibile utilizzare il nome dell'operatore di overload:

operator()(n-1); 

o invocare l'operatore sull'oggetto corrente:

(*this)(n-1); 
1

È possibile utilizzare la sintassi esplicita operator:

class factorial { 
    int operator()(int n) { 
    if (n == 0) 
     return 1; 
    return n * operator()(n-1); 
    } 
}; 

O dereferenziamento this:

class factorial { 
    int operator()(int n) { 
    if (n == 0) 
     return 1; 
    return n * (*this)(n-1); 
    } 
}; 
Problemi correlati