Idea jest taka żeby napisać klasę która liczy dajmu na to całkę z funkcji f, ale nie wie z jakiej funckji --- metoda wyliczająca w punkcie x jest abstarkcyjna:
virtual inline double getValue(double x)=0;
Teraz dodajemy małe klasy, któe na swój sposób implementują funkcję (może to być przez wskaźnik do funkcji, przez obiekt, przez parser matematyki.
*wrapper_f --- implementuje getValue jako wskaźnik do funkcji
*wrapper_obj --- implementuje getValue poprzez obiekt funkcyjny
random_generator_base --- zwykły generator liczb losowych (też z funkcją virtualną)
range_function_base --- to klasa opisująca obiekt będący funkcją na przedziale skoczonym.
random_generator --- losuje liczby z dziedziny i zbioru wartości funkcji.
von_neumann --- coś losującego liczby losowe metodą eliminacji von neumanna
simple_monte_carlo --- całkuje funkcję metodą monte carlo.
Cztery ostatnie klasy mają swoje wrappery.
O tyle fajnie że klasa (cała) simple_monte_carlo_f wygląda tak i jest już w pełni funkcjonalną klasą mającą kilkanaście metod:
template &lq class DOUBLE&rq
class simple_monte_carlo_f:
public random_generator_base_wrapper_f& lq DOUBLE&rq,
public simple_monte_carlo_base &lq DOUBLE&rq,
public range_function_base_wrapper_f &lq DOUBLE&rq{
simple_monte_carlo_f(DOUBLE _begin, DOUBLE _end, DOUBLE
(*_rand)(),DOUBLE (*_fun)(DOUBLE x)):
random_generator_base_wrapper_f lq DOUBLE&rq(_rand),
range_function_base_wrapper_f lq DOUBLE&rq(_fun)
{
this->set(_begin,_end);
}
};
Na diagramie (uproszczonym, bo wskazującym tylko dziedziczenie) wygląda cały schemat masakrycznie --- tak: