Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Ukryta implementacja rekurencji

Ostatnio zmodyfikowano 2015-04-03 23:52
Autor Wiadomość
Quirinnos
Temat założony przez niniejszego użytkownika
Ukryta implementacja rekurencji
» 2015-04-02 22:12:50
Witam,
takie trochę głupie pytanie mam. Jak porządnie "ukryć" wywołanie rekurencji w metodzie?
O co chodzi,
przykładowo mamy:
C/C++
class Foo
{
public:
    void print( node * T ) const; // np rekurencyjna metoda wypisujaca stos
private:
    tu mamy cos, np wskaznik na top stosu.node * TOP;
   
};

//potem w maine dajemy
Foo f;
f.print() // -------- i chodzi o to, żeby nie musieć przekazywać tutaj, tego wskaźnika (który notabene ma być prywatny)

Zrobiłem to w taki sposób, że metoda print nie przyjmuje nic, a jedyne co robi to wywołuje prywatną metodę _print(node* T), która zajmuje się rekurencją. 
C/C++
class Foo
{
public:
    void print() const
    {
        _print( TOP );
    }
private:
    tu mamy cos, np wskaznik na top stosu.node * TOP;
    void _print( node * T ) const
    {
        rekurencja( rekurencja(...) )
    }
   
};
Co myślicie o takim rozwiązaniu? Macie coś lepszego? Przy projekcie, który ma trochę rekurencyjnych metod, trzaby wtedy dla każdej tworzyć prywatny odpowiednik.

Zapraszam do dysputy.
Pozdrawiam. ;)
P-129956
notabigthreat
» 2015-04-03 00:32:57
Takie rozwiązanie udało mi się sklecić. Z zewnątrz klasy Foo nie można użyć typu privenum przy podawaniu pierwszego parametru, więc funkcję print(privenum, node*) wywołać można tylko z pustym nawiasem. Uznaję to za plus, bo później nie trzeba pamiętać o jeszcze jednym drobiazgu. W środku Foo privenum jest dostępny i możemy tam pisać swoje rekursywne cuda. Minusem jest lekki bałagan w kodzie klasy.
C/C++
class node { /* ... */ };

class Foo
{
    node * TOP;
    enum privenum { pierwsze_wywolanie, kolejne_wywolania };
   
public:
    void print( privenum arg1 = pierwsze_wywolanie, node * T = nullptr ) const
    {
        if( arg1 == pierwsze_wywolanie )
             T = TOP;
       
        //...
       
        if( true ) //w prawdziwym kodzie prawdopodobnie bylby tu jakis sensowny warunek
             print( kolejne_wywolania, T + 1 );
       
    }
    Foo() { /* ... */ }
};

int main()
{
    const Foo f;
   
    //    tutaj nie mozna podac wlasnego argumentu 1 (nie ma dostepu do jego typu),
    //    wiec drugi tez musi byc niewpisany
    f.print();
    return 0;
}
P-129957
Fireho
» 2015-04-03 23:52:36
@Quirinnos Możesz zamienić
void _print( node * T ) const
 na metodę statyczną, ponieważ i tak nie używa wskaźnika
this
.
P-130052
« 1 »
  Strona 1 z 1