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

Przesyłanie funkcji jako argumentu w klasie ?

Object Storage Arubacloud
0 głosów
907 wizyt
pytanie zadane 13 grudnia 2015 w C i C++ przez Sedi Stary wyjadacz (10,200 p.)
edycja 13 grudnia 2015 przez Sedi

Witam !

Postanowiłem, że zrobię klasę . Projekt jest bardzo prosty, tzn. zawiera dwie funkcje w klasie i ich wywołanie. Jedna funkcja(którą nazwałem newbie) tzn:

int newbie(int a,int b,int(*def)(int,int))
      {
          return def(a,b);
      }

miała za zadanie być funkcją, która zawiera jako trzeci argument(tj.int(*definition)(int,int)) inną funkcję (a argumenty do niej podawane są jako pierwszy i drugi w newbie) . Bez tworzenia klasy wszystko działało dobrze, ale gdy stworzę klasę, wyskakuje błąd: 

error: no matching function for call to 'Lalala::newbie(int, int, <unresolved overloaded function type>)'|

Kod:

#include <iostream>

using namespace std;
class Lalala
{
  public:

      int dodaj(int a ,int b)
      {
          return a+b;
      }

      int newbie(int a,int b,int(*def)(int,int))
      {
          return def(a,b);
      }

};
int main()
{

    Lalala l1;

    l1.newbie(10,15,l1.dodaj);

    cout << "Hello world!" << endl;
    return 0;
}

Czy mógłbyś mi wskazać miejsce, gdzie popełniam błąd ?:)

Pozdrawiam !

 

3 odpowiedzi

+2 głosów
odpowiedź 13 grudnia 2015 przez criss Mędrzec (172,590 p.)
wybrane 14 grudnia 2015 przez Sedi
 
Najlepsza

Funkcja przyjmuje wskaźnik na funkcje, nie na metode. Zobacz w Google jaka jest różnica. 

static poprawiło stan rzeczy, bo metody statyczne są bardziej niezależne i nie są traktowane jak metody. Ale przecież nie o to ci chodzi..

Także, żeby działał ten twój kod, zmień kod tak, żeby newbie przyjmowała wskaźnik na metode klasy Lalala. A jeszcze lepiej użyj std::function, która jest uniwersalna i umożliwia pracowanie z metodami i funkcjami jednoczesnie.

komentarz 13 grudnia 2015 przez Sedi Stary wyjadacz (10,200 p.)

A jak użyć w tym konkretnym przypadku std::function ?

Próbowałem  w taki sposób :

l1.newbie(10,14,std::function <int()>l1.dodaj;

A potem przerabiając dodaj na std::function tym sposobem:

std::function<int (int a ,int b)>dodaj

ale żadne z nich nie działa.

Jak to osiągnąć ?:)

Pozdrawiam i dzięki za rzeczową odpowiedź :)

komentarz 14 grudnia 2015 przez criss Mędrzec (172,590 p.)

Hmm, nie jest do końca tak jak mówiłem. Ale można to osiągnąć w ten sposób:

class Klasa{

public:

   int f2(){ return 2; }

   void f(std::function<int(Klasa&)> fun){ std::cout<< fun(*this) <<std::endl; }
};

int main()
{
   Klasa obj;
   obj.f(&Klasa::f2);
}

Pierwszym argumentem w std::function musi być referencja do obiektu, jeśli chcemy przekazywać metody (to akurat dość logiczne, bo musi być wiadome na rzecz jakiego obiektu ma być metoda wywołana). No i nie możemy przekazywać metod w sposób obiekt.metoda, tylko operatorem ::

komentarz 14 grudnia 2015 przez Sedi Stary wyjadacz (10,200 p.)
Pięknie działa :)

Tylko jedno pytanie:  Dlaczego nie można obiekt.metoda ? Tylko trzeba operatorem zasięgu ?:)

Pozdrawiam :)
komentarz 14 grudnia 2015 przez criss Mędrzec (172,590 p.)
Cóż, nie jestem pewien, ale faktycznie IMO większy sens ma Klasa::metoda, bo metoda w zasadzie jest jedna na całą klase, a wywołując z obiektu (obiekt.metoda()) po prostu ta jedna metoda korzysta z wartości w konkretnym obiekcie. Dobrze to widać właśnie tutaj, gdzie musimy podać referencje do obiektu.
komentarz 14 grudnia 2015 przez Sedi Stary wyjadacz (10,200 p.)
To ma sens :) Wielkie dzięki za odpowiedź :) -Teraz trzeba iść spać, a przed snem nie wolno programować, bo potem nie zasnę :) Tak, czy inaczej,  najlepsza, ładny uśmiech i dziękuje leci właśnie do Ciebie :)

Pozdrawiam i życzę spokojnej nocy, Dobranoc :)
komentarz 14 grudnia 2015 przez criss Mędrzec (172,590 p.)
Też tak mam :D Dobranoc :)
+1 głos
odpowiedź 13 grudnia 2015 przez niezalogowany
Nie bardzo rozumiem co chcesz w ten sposób osiągnąć. Naturalne wydaje się oczekiwanie na konkretną wartość, i wprowadzenie jako argument funkcji, która tą wartość zwróci, ale to co Ty wymyśliłeś... Może nie potrafię jeszcze aż tak abstrakcyjnie myśleć ;)
+1 głos
odpowiedź 13 grudnia 2015 przez Porcupine Nałogowiec (31,560 p.)
Nie za bardzo wiem o co w tym kodzie chodzi :) Ale mój kompilator mówi, że potrzebujesz zrobić funkcję dodaj jako: static i wtedy się kompiluje!

Pozdrawiam,
komentarz 13 grudnia 2015 przez Sedi Stary wyjadacz (10,200 p.)
Ahh, to static :) Dzięki za odpowiedź :)

Pozdrawiam :)

Podobne pytania

0 głosów
2 odpowiedzi 1,791 wizyt
pytanie zadane 2 grudnia 2016 w C i C++ przez Riddick Bywalec (2,600 p.)
0 głosów
1 odpowiedź 308 wizyt
pytanie zadane 16 listopada 2017 w C i C++ przez Eliro Stary wyjadacz (12,160 p.)
0 głosów
2 odpowiedzi 241 wizyt
pytanie zadane 5 sierpnia 2015 w C i C++ przez rafalmagician Obywatel (1,320 p.)

92,579 zapytań

141,432 odpowiedzi

319,663 komentarzy

61,964 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!

...