Wskaźnik do funkcji klasy

0

Witam.
Stworzyłem wskaźnik do funkcji i kiedy przypisuje mu adres, kompilator zgłasza błędy. Byłbym wdzięczny za pomoc:

class klasa
{
   public:
   void wyswietl()
   {
      cout << "Hello World!";
   }
};
 
int main(){
void (*w)();
klasa *obiekt=new klasa;
w=obiekt->wyswietl();
    return 0;
}
0

Do w przypisujesz to co zwraca Ci wywołana funkcja czyli void. Poza tym nie do końca jest dla mnie jasne co i dlaczego chcesz zrobić.

3
w=obiekt->wyswietl();

Tutaj wywołałeś funkcję wyswietl, a ponieważ nic ona nie zwraca, to nie możesz przypisać wyniku do wskaźnika na funkcję.

Jeśli chodzi o wskaźniki na elementy klasy, to różnią się one od standardowych, więc do w nie dasz rady przypisać wskaźnika na wyswietl. To wszystko wyczytałbyś też w dowolnej książce/kursie ;​)

Użyj wskaźnika na element klasy, funkcję:

void klasa::(*w)();
w = &klasa::wyswietl;
0

Czyli w żaden sposób nie da się wyciągnąć adresu funkcji z dynamicznie utworzonego obiektu?

0

Nie rozumiem pytania. Funkcje mają zawsze ten sam adres, niezależnie czy obiekty tworzysz dynamicznie czy nie.

edit: chyba, że o to chodzi: w przypadku funkcji wirtualnych, jeśli nie wiesz jaki jest dynamiczny typ to musisz zdać się na RTTI, lub normalny mechanizm wywoływania funkcji wirtualnych.

0

Może podam na przykładzie. Tu mam wskaźnik do funkcji

 void wyswietl()
   {
      cout << "Hello World!";
   }

 
int main(){
void (*a)();
a=wyswietl();
a();
    return 0;
}

A ja chcę zrobić tak by mieć wskaźnik do funkcji klasy
Czyli to co nie działa np. a=obiekt->wyswietl();

2

Przecież @kq podał Ci kod

#include <iostream>
using namespace std;

class klasa
{
public:
    void wyswietl()
    {
        cout << "Hello World!";
    }
};
 
int main()
{
    void (klasa::*w)();
    w = &klasa::wyswietl;
    
    klasa* obiekt = new klasa;
    (obiekt->*w)();
}

No i wydaje mi się, że koncepcyjnie trochę się gubisz. Funkcja nie należy do obiektu, więc nie ma czegoś takiego jak wyciągnąć adresu funkcji z dynamicznie utworzonego obiektu. Możesz wywołać funkcję na obiekcie, co tak naprawdę jest przekazywaniem tego obiektu do funkcji jako niejawny argument (kiedyś widziałem artykuł @Gynvael Coldwind o "programowaniu obiektowym" w C i jak takie wywołanie obiektowe się tłumaczy na asembler, ale chwilowo nie mogę znaleźć linku).

0

Dziękuje o to mi chodziło. Dzięki na namiary poszukam sobie :)

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