Ukryta implementacja rekurencji
Ostatnio zmodyfikowano 2015-04-03 23:52
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: class Foo { public: void print( node * T ) const; private: tu mamy cos, np wskaznik na top stosu.node * TOP; };
Foo f; f.print()
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ą. 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. ;) |
|
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. 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 ) print( kolejne_wywolania, T + 1 ); } Foo() { } };
int main() { const Foo f; f.print(); return 0; } |
|
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 . |
|
« 1 » |