Wskaźnik na funkcję

Odpowiedz Nowy wątek
2020-05-22 13:12

Rejestracja: 2 miesiące temu

Ostatnio: 1 tydzień temu

0

Witajcie.
Ostatnio w mojej zacnej książce nauczyłem się czy przeczytałem o tworzeniu i wykorzystywaniu wskaźnika na funkcję.Ogólnie to musiałem sobie dopomóc internetem,gdyż w księdze zaklęć niezbyt zrozumiały zapis.Coś rozumiem.Lecz gdzie to mogę wykorzystać? Jak często się korzysta? Gdzieś w internecie wyczytałem że przykładowo funkcja qsort.Normalna funkcja jest dla mnie zrozumiała,ale jeśli przykładowo chce funkcję struktury to mi pokazuje błąd,dlaczego? Niżej napisze fragment kodu.Chyba że coś robię nie tak,to mówcie.

#include <iostream>
using namespace std;

struct point{
int x,y;
string show(int, int);
}pkt1;

int main(){
string (*wsk_f)(int, int);
wsk_f =  /// i tutaj problem, bo jak dam pkt1.show; to błąd,to co tu dać?

return 0;
}
edytowany 2x, ostatnio: kq, 2020-05-22 13:35

Pozostało 580 znaków

2020-05-22 13:27
Moderator

Rejestracja: 16 lat temu

Ostatnio: 10 minut temu

2
  1. A co dałbyś przy każdym innym wskaźniku? Brakuje ci dereferencji. Albo wsk->cośstam albo (*wsk).cośtam
  2. Jest to przydatne kiedy chcesz przezkazać funkcje jako argument innej funkcji. Np. chcesz coś sortować i ale chcesz żeby "sposób porównywania" mógł być dowolnie ustalony przez użytkownika -> pozwalasz użytkownikowi przekazać do twojej funkcji sortującej funkcje która pozwala porównać ze sobą dwa obiekty, w taki sposób w jaki użytkownik chce. Jest to podstawa takiego wzorca jak map-filter-reduce.

Masz problem? Pisz na forum, nie do mnie. Nie masz problemów? Kup komputer...
edytowany 2x, ostatnio: Shalom, 2020-05-22 13:28

Pozostało 580 znaków

2020-05-22 13:28

Rejestracja: 2 lata temu

Ostatnio: 1 minuta temu

0

Naucz się najpierw wskaźników do zwykłych funkcji, a nie do funkcji znajdujących się w klasach

Pozostało 580 znaków

2020-05-22 13:32

Rejestracja: 5 lat temu

Ostatnio: 4 godziny temu

1

Przykład

#include <iostream>
#include <functional>

using namespace std;

struct Point
{
    int x {1} , y {2};
    string calculate( int a , int b ){ return to_string(a*x+b*y); };
};

int main()
{
    Point point;

    string (Point::*pointer1)(int, int);
    pointer1 = &Point::calculate;
    cout << (point.*pointer1)(6,4) << endl;

    auto pointer2 = &Point::calculate;
    cout << (point.*pointer2)(1,2) << endl;

    cout << invoke(pointer2,point,3,3) << endl; // valid from C++17

    return 0;
}
edytowany 1x, ostatnio: TomaszLiMoon, 2020-05-22 13:41
Pokaż pozostałe 3 komentarze
Tak bardziej serio, nie widzę powodu żeby równać w dół z każdą poradą. Jak ktoś ma ograniczenia typu "muszę używać C++ Buildera 6" to powie po otrzymaniu poprawnej rady dla danego roku kalendarzowego. - kq 2020-05-22 13:39
Nie mogłem się powstrzymać: https://imgflip.com/i/42fdpe :) - plx211 2020-05-22 13:43
@kq - nie istnieje "poprawna rada dla danego roku kalendarzowego", jest tylko dla danego środowiska. U mnie np. nie możemy jeszcze w pełni stosować C++14. Nie dlatego, że kierownictwo zabrania, tylko dlatego, że w praktyce doprowadzenie naszego ekosystemu do kompatybilności z C++14, nie mówiąc o 17 jest nieopłacalne. - GutekSan 2020-05-22 13:45
std::function w takim razie xd - Czitels 2020-05-22 13:55
Nie zgadzam sie. Gość wyraźnie uczy się podstaw, nie ma sensu pchać mu najpierw do głowy starej wiedzy. Gdy już siądzie w pracy do projektu - najwcześniej za kilka lat - to C++14 będzie tak samo antyczny jak C++11 teraz. Ale w razie czego się kilku utrudnień douczy. - kq 2020-05-22 14:13

Pozostało 580 znaków

2020-05-22 13:37

Rejestracja: 3 lata temu

Ostatnio: 1 minuta temu

0

http://www.newty.de/fpt/fpt.html#defi


Pozostało 580 znaków

Odpowiedz

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