Tablica funkcji

Awatar użytkownika
Harry Xin
Użytkownik
Użytkownik
Posty: 545
Rejestracja: 9 sie 2007, o 19:15
Płeć: Mężczyzna
Podziękował: 148 razy
Pomógł: 83 razy

Tablica funkcji

Post autor: Harry Xin » 2 gru 2008, o 02:49

Czy w języku C++ można utworzyć tablicę, której elementami są funkcje?
Jeżeli tak to jak to zrobić?

xiikzodz
Użytkownik
Użytkownik
Posty: 1874
Rejestracja: 4 paź 2008, o 02:13
Płeć: Kobieta
Lokalizacja: Lost Hope
Podziękował: 28 razy
Pomógł: 502 razy

Tablica funkcji

Post autor: xiikzodz » 2 gru 2008, o 04:29

Poprzez wskazniki do funkcji. Mniej wiecej tak to wyglada:

Kod: Zaznacz cały

class TMyClass
{
public:
   int DoIt(float a, char b, char c){ cout << "TMyClass::DoIt"<< endl; return a+b+c;};
   int DoMore(float a, char b, char c) const
         { cout << "TMyClass::DoMore" << endl; return a-b+c; };

   /* more of TMyClass */
};

int (TMyClass::*pt2Member)(float, char, char) = NULL;
int (TMyClass::*pt2ConstMember)(float, char, char) const = NULL;

pt2ConstMember = &TMyClass::DoMore; // correct assignment using address operator
pt2Member = &TMyClass::DoIt; // note: <pt2Member> may also legally point to &DoMore
Szukaj "function pointer", zeby dowiedziec sie szczegolow nt. porownywania, przekazywania argumentow etc.

Kod: Zaznacz cały

//------------------------------------------------------------------------------------
// 2.8 How to Use Arrays of Function Pointers

// C ---------------------------------------------------------------------------------

// type-definition: 'pt2Function' now can be used as type
typedef int (*pt2Function)(float, char, char);

// illustrate how to work with an array of function pointers
void Array_Of_Function_Pointers()
{
   printf("\nExecuting 'Array_Of_Function_Pointers'\n");

   // define arrays and ini each element to NULL, <funcArr1> and <funcArr2> are arrays
   // with 10 pointers to functions which return an int and take a float and two char

   // first way using the typedef
   pt2Function funcArr1[10] = {NULL};

   // 2nd way directly defining the array
   int (*funcArr2[10])(float, char, char) = {NULL};


   // assign the function's address - 'DoIt' and 'DoMore' are suitable functions
   // like defined above in 2.1-4
   funcArr1[0] = funcArr2[1] = &DoIt;
   funcArr1[1] = funcArr2[0] = &DoMore;

   /* more assignments */

   // calling a function using an index to address the function pointer
   printf("%d\n", funcArr1[1](12, 'a', 'b'));         //  short form
   printf("%d\n", (*funcArr1[0])(12, 'a', 'b'));      // "correct" way of calling
   printf("%d\n", (*funcArr2[1])(56, 'a', 'b'));
   printf("%d\n", (*funcArr2[0])(34, 'a', 'b'));
}


// C++ -------------------------------------------------------------------------------

// type-definition: 'pt2Member' now can be used as type
typedef int (TMyClass::*pt2Member)(float, char, char);

// illustrate how to work with an array of member function pointers
void Array_Of_Member_Function_Pointers()
{
   cout << endl << "Executing 'Array_Of_Member_Function_Pointers'" << endl;

   // define arrays and ini each element to NULL, <funcArr1> and <funcArr2> are
   // arrays with 10 pointers to member functions which return an int and take
   // a float and two char

   // first way using the typedef
   pt2Member funcArr1[10] = {NULL};

   // 2nd way of directly defining the array
   int (TMyClass::*funcArr2[10])(float, char, char) = {NULL};


   // assign the function's address - 'DoIt' and 'DoMore' are suitable member
   //  functions of class TMyClass like defined above in 2.1-4
   funcArr1[0] = funcArr2nd use an array of function pointers in C and C++. The first way uses a typedef, the second way directly defines the array. It's up to you which way you prefer.


[1] = &TMyClass::DoIt;
   funcArr1[1] = funcArr2[0] = &TMyClass::DoMore;
   /* more assignments */

   // calling a function using an index to address the member function pointer
   // note: an instance of TMyClass is needed to call the member functions
   TMyClass instance;
   cout << (instance.*funcArr1[1])(12, 'a', 'b') << endl;
   cout << (instance.*funcArr1[0])(12, 'a', 'b') << endl;
   cout << (instance.*funcArr2[1])(34, 'a', 'b') << endl;
   cout << (instance.*funcArr2[0])(89, 'a', 'b') << endl;
}

spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

Tablica funkcji

Post autor: spajder » 2 gru 2008, o 13:55

a tak bardziej po ludzku:
linijka:

Kod: Zaznacz cały

typedef double (*nazwa)(int, string);
tworzy nowy typ o nazwie nazwa. Będzie to wskaźnik do funkcji, która przyjmuje parametry int i string i zwraca double. Jak masz np. funkcję:

Kod: Zaznacz cały

double f(int x, string s)
{
    return 0;
}
to może zapisać:

Kod: Zaznacz cały

nazwa wskaznik = &f;
cout << f(1, "ddd");
czyli jest to najzwyklejszy (no prawie) wskaźnik. I możesz zrobić tablicę tak jak przy normalnych wskaźnikach

xiikzodz
Użytkownik
Użytkownik
Posty: 1874
Rejestracja: 4 paź 2008, o 02:13
Płeć: Kobieta
Lokalizacja: Lost Hope
Podziękował: 28 razy
Pomógł: 502 razy

Tablica funkcji

Post autor: xiikzodz » 2 gru 2008, o 18:05

Pytal o C++, wiec wydawalo mi sie, ze chce miec tablice metod. A na to jest kilka mozliwosci, bo metody sa roznych typow.

spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

Tablica funkcji

Post autor: spajder » 3 gru 2008, o 00:09

w c++ są przecież wskaźniki na funkcje...
zresztą i to wskaźnik i to - i używa się ich podobnie

xiikzodz
Użytkownik
Użytkownik
Posty: 1874
Rejestracja: 4 paź 2008, o 02:13
Płeć: Kobieta
Lokalizacja: Lost Hope
Podziękował: 28 razy
Pomógł: 502 razy

Tablica funkcji

Post autor: xiikzodz » 3 gru 2008, o 01:02

Kompilator C++ na ogol rozumie kod C, ale jesli zalozyciel postu studiuje informatyke i ma zadanie zaimplementowac cos w C++, to powinien uzywac metod, bo na tym polega programowanie w C++ w odroznieniu od C. Implementacja w C++ jest rownowazna implementacji obiektowej. Dla ludzi, ktorzy cos tam dlubia sobie na boku faktycznie nie ma to zadnego znaczenia.

spajder
Użytkownik
Użytkownik
Posty: 735
Rejestracja: 7 lis 2005, o 23:56
Płeć: Mężczyzna
Lokalizacja: Łódź
Podziękował: 2 razy
Pomógł: 133 razy

Tablica funkcji

Post autor: spajder » 3 gru 2008, o 02:06

trochę przeceniasz c++. Przede wszystkim: NIE jest to język obiektowy, ma tylko elementy obiektowości. Nie wymaga takiego stylu programowania. Jest dobry zarówno do dośc dużych projektów jak i sterowników - wtedy się raczej w obiektowość nie bawimy. Przewagę nad poprzednikem c++ ma w kwestii STL.
Poza tym - używanie wskaźników na metody potrzebuje metod a to z kolei potrzebuje klas. A tworzenie wszystkich metod w klasach wcale nie jest takim dobrym pomysłem...

xiikzodz
Użytkownik
Użytkownik
Posty: 1874
Rejestracja: 4 paź 2008, o 02:13
Płeć: Kobieta
Lokalizacja: Lost Hope
Podziękował: 28 razy
Pomógł: 502 razy

Tablica funkcji

Post autor: xiikzodz » 3 gru 2008, o 03:02

Faktycznie C++ w relacji do C zawiera rozszerzenie o dodatkowe mozliwosci wyboru stylu programowania, a to, czy programista wybierze wlasciwy styl, to juz inna sprawa.

Mnie raczej chodzilo o to, ze jesli pytamy o implementacje w C++, to domyslnie nie pytamy o implementacje w C. Dotyczy to np. pytan studentoww OOP. Ale mnie wszystko w sumie jedno. Odpowiedzi sa chyba wyczerpujace i chetnie uznam, ze twoja jest milion razy lepsza od mojej, szczegolnie, jesli przyniesie ci to satysfakcje.

ODPOWIEDZ