Tablica wskaźników do funkcji składowych klasy

0

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)?

0

Najprościej przerób dwie macierze na stos macierzy oraz ONP.

0

Myślałem o takim rozwiązaniu jeszcze przed rozpoczęciem pisania tego programu. Jednak wybrałem jaki wybrałem, a przerabianie zajmie teraz sporo czasu. W przyszłości możliwe, że zrobię to na ONP.

0

Jeżeli przerabianie zajmie ci więcej niż 30 min to pokpiłeś cały projekt.

1
struct Equation
{
  struct matrix{};
  matrix *A, *B;

  Equation()
  {
    chooseEquationTab[0] = [this](){ addition(A, B); };
    chooseEquationTab[1] = [this](){ multiplication(A, B); };
    chooseEquationTab[2] = [this](){ multiplication(B, A); };
    chooseEquationTab[3] = [this](){ determinant(A, B); };
    chooseEquationTab[4] = [this](){ determinant(B, A); };
  }

  void addition(matrix* a, matrix* b) {}
  void multiplication(matrix* a, matrix* b) {}
  void determinant(matrix* a, matrix* b) {}

  std::function<void()> chooseEquationTab[5];
};
0

_13th_Dragon raczej zajmie to mniej niż 30 minut. Domyślam się, że jak już będę miał wszystko w ONP to działania realizować za pomocą przeładowania operatorów. Tylko problem w tym jak w miarę czytelnie/intuicyjnie dla użytkownika rozwiązać problem operatora dla obliczania macierzy odwrotnej i transpozycji? A(-1) oraz AT?

0

komendy:

clear
add Y X
+
-
*
inv
tr

1 użytkowników online, w tym zalogowanych: 0, gości: 1