Tablica funkcji
-
- 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
Poprzez wskazniki do funkcji. Mniej wiecej tak to wyglada:
Szukaj "function pointer", zeby dowiedziec sie szczegolow nt. porownywania, przekazywania argumentow etc.
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
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;
}
-
- 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
a tak bardziej po ludzku:
linijka:
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ę:
to może zapisać:
czyli jest to najzwyklejszy (no prawie) wskaźnik. I możesz zrobić tablicę tak jak przy normalnych wskaźnikach
linijka:
Kod: Zaznacz cały
typedef double (*nazwa)(int, string);
Kod: Zaznacz cały
double f(int x, string s)
{
return 0;
}
Kod: Zaznacz cały
nazwa wskaznik = &f;
cout << f(1, "ddd");
-
- 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
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.
-
- 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
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...
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...
-
- 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
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.
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.