• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźnik na funkcje

Object Storage Arubacloud
0 głosów
789 wizyt
pytanie zadane 13 stycznia 2018 w C i C++ przez Sic Dyskutant (8,510 p.)
edycja 13 stycznia 2018 przez Sic

Witam

Zwracam się z pomocą o objaśnienie pewnego wątku w programowaniu C++, a dokładnie wskaźników na funkcje. Przyznaje, że zebrałem na ten temat wiele informacji i przyznaję również, że nie wiele z tego rozumiem. Mianowicie nie rozumiem sensu ich wykorzystana, jak również ich działania oraz jaki jest zysk z ich korzystania.

2 odpowiedzi

+3 głosów
odpowiedź 13 stycznia 2018 przez Arkadiusz Sikorski Pasjonat (20,160 p.)
wybrane 13 stycznia 2018 przez Sic
 
Najlepsza

Na przykład możesz przekazać przy pomocy takiego wskaźnika funkcję do innej funkcji jako argument. Wyobraź sobie, że chcesz, żeby funkcja przyjmowała tablicę, w której znajdzie wartość najmniejszą według podanego kryterium, a kryterium to może się zmieniać. Możesz wtedy przekazać do tej funkcji funkcję, która porówna dwa elementy w jakiś szczególny sposób.

Na podobnej zasadzie działa funkcja sortująca z <algorithm>. Przyjmuje iteratory kontenera standardowego oraz funkcję, która definuje relację mniejszy-większy dla dwóch elementów danego typu. Pozwala to posortować na przykład wektor obiektów naszego własnego typu. Jeżeli na przykład miałbyś klasę samochód i chciał użyć std::sort'a do posortowania zbioru obiektów klasy samochód wg roku produkcji, to mógłbyś przekazać jako argument funkcję porównującą wspomniany rok. Jeżeli chciałbyś posortować je wg pojemności silnika - proszę bardzo, wystarczy podać do std::sort'a inną funkcję. Zauważ, że takie podejście pozwala zaimplementować funkcję sortującą raz, a kryterium oceny możemy zmieniać dowolnie.

#include <algorithm>
#include <vector>
#include <iostream>

class Car
{
	size_t year;
	float engineCapacity;
public: 
	Car(size_t y, float ec):year(y), engineCapacity(ec){}
	size_t getYear()
	{
		return year;
	}
	float getEngineCapacity()
	{
		return engineCapacity;
	}
};

bool compareYear(Car first, Car second)
{
	return first.getYear() < second.getYear();
}

bool compareEngineCapacity(Car first, Car second)
{
	return first.getEngineCapacity() < second.getEngineCapacity();
}

int main()
{
	std::vector<Car> garage;
	garage.push_back(Car(1956, 1.6));
    garage.push_back(Car(1972, 1.8));
    garage.push_back(Car(2007, 1.4));
	
	std::sort(garage.begin(), garage.end(), compareEngineCapacity);
    for(Car car: garage)
        std::cout << car.getEngineCapacity() << std::endl;
    
    std::sort(garage.begin(), garage.end(), compareYear);
    for(Car car: garage)
        std::cout << car.getYear() << std::endl;

	return 0;
}

Pisanie takich krótki funkcji może być czasami męczące, więc warto używać funkcji lamda, którymi polecam się zainteresować, ale to już bardziej skomplikowana konstrukcja języka C++. Co ciekawe, jako funkcję porównującą można przekazać też obiekt, który ma odpowiednio zdefiniowaną funkcję operator(), jest to tak zwany obiekt funkcyjny.

–1 głos
odpowiedź 13 stycznia 2018 przez Knayder Nałogowiec (37,640 p.)
Wskaźnik na funkcje czysto zdefiniowaną w kodzie, może być mało przydatny, choć zdarza się przydatny. Zabawa zaczyna się z lambdą. Wtedy zaczyna się zabawa xd.

Podobne pytania

0 głosów
0 odpowiedzi 549 wizyt
pytanie zadane 20 maja 2020 w C i C++ przez fortuna Początkujący (310 p.)
0 głosów
1 odpowiedź 144 wizyt
pytanie zadane 8 kwietnia 2019 w C i C++ przez Aleksandra01 Użytkownik (530 p.)
0 głosów
2 odpowiedzi 201 wizyt
pytanie zadane 13 stycznia 2017 w C i C++ przez czujek22 Dyskutant (7,670 p.)

92,563 zapytań

141,413 odpowiedzi

319,590 komentarzy

61,948 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...