Witam. Piszę program, w którym użytkownik będzie miał możliwość wyboru działania z combobox'a. Generalnie można zrobić wszystko na instrukcji switch i działa elegancko:
switch(ui->action->currentIndex())
{
case 0:
eq.addition(eq.A, eq.B); //A+B
break;
case 1:
eq.multiplication(eq.A, eq.B); //A*B
break;
case 2:
eq.multiplication(eq.B, eq.A); //B*A
break;
case 3:
eq.determinant(eq.A); //det(A)
break;
case 4:
eq.determinant(eq.B); //det(B)
break;
case 5:
eq.addition(eq.A, eq.B);
break;
case 6:
eq.addition(eq.A, eq.B);
break;
case 7:
eq.addition(eq.A, eq.B);
break;
case 8:
eq.addition(eq.A, eq.B);
break;
Od 5-8 celowo wstawione jest to samo.
Jednak pomyślałem sobie, że można to zrobić za pomocą wskaźników do funkcji.
void(Equation::*chooseEquation[3]) (Equation::matrix *, Equation::matrix *) =
{
&Equation::addition,
&Equation::multiplication,
&Equation::determinant
};
Dodam, że funkcja determinant ma drugi argument domniemany więc spokojnie można ją wsadzić do takiego wskaźnika.
Byłoby po problemie gdyby kolejność argumentów nie zmieniała się. To znowu wymyśliłem sobie, że można kolejne działania wsadzić do tablicy i z tablicy wywoływać funkcje do wykonania:
void chooseEquationTab[5] =
{
(eq.*chooseEquation[0])(eq.A, eq.B),
(eq.*chooseEquation[1])(eq.A, eq.B),
(eq.*chooseEquation[1])(eq.B, eq.A),
(eq.*chooseEquation[2])(eq.A),
(eq.*chooseEquation[2])(eq.B)
};
chooseEquationTab[ui->action->currentIndex()];
I tu pojawia się problem...nie można utworzyć tablicy typu void.
Czy macie jakiś pomysł jak coś takiego wykonać? Może nie ma sensu się z tym tak babrać i lepiej zostawić na switch (tutaj potrzebujemy dodatkowej pamięci na wskaźniki chooseEquation oraz chooseEquationTab)?