Wskaźnik na funkcję wewnętrz innej klasy

0

Witam. Mam pewien problem z dostępem do funkcji publicznej jednej klasy, a konkretnie do jej adresu w pamięci. W komentarzach wyjaśnię o co chodzi:

class Klasa1 {
  public:

  void PozadanaFunkcja() ;
};

class Klasa2 {
  private:

  /* jak widać Klasa2 zawiera w sobie obiekt Klasa1 */
  Klasa1 ObiektKlasy1 ;

  public:

  /* akcesor zwraca referencję do powyższego obiektu */
  Klasa1 & getObiektKlasy1 () { return ObiektKlasy1 ; }
};

class Klasa3 {
  private:

  /* wskaźnik na funkcję typu void */
  void (*wskNaFunkcje)() ;

  public:

  /* konstruktor w którym pobierana jest funkcja do WskNaFunkcję */
  Klasa3( Klasa2 & refDoKlasy2 ) {

  /* DLACZEGO TO NIE DZIAŁA ?
  this->wskNaFunkcje = refDoKlasy2.getObiektKlasy1().PozadanaFunkcja ;  */
  /* DLACZEGO TO TEŻ NIE DZIAŁA ?
  this->wskNaFunkcje = refDoKlasy2.getObiektKlasy1().PozadanaFunkcja() ;  */
  /* I TO TEŻ ?
  this->wskNaFunkcje = & ( refDoKlasy2.getObiektKlasy1().PozadanaFunkcja ) ;  */
  /* I JESZCZE TO?
  this->wskNaFunkcje = & ( refDoKlasy2.getObiektKlasy1().PozadanaFunkcja() ) ;  */

  /* kończą się pomysły.. Wydaje się że błędnie używam operatorów, kierowałem się tym że normalnie
      wskaźnik na funkcję deklaruje się tak:

     void funkcja() { ; }
     void (*wsk)() = &funkcja ;
  */

  }

};

Po wklejeniu powyższego kodu do edytora, wszystko powinno się kompilować, chyba że odkomentuje się zakomentowane instrukcje i właśnie to jest problemem..

Jak mam się odwołać do funkcji publicznej należącej do klasy pierwszej posiadając referencję do klasy drugiej, która ma w sobie instancję klasy pierwszej.
Może inaczej : nie jak mam się odwołać do funkcji, ale jak mam zdobyć jej adres aby móc korzystać ze wskaźnika na funkcję?
Dzięki za pomoc. Pozdrawiam!

0

Wskaźnik na funkcję nie może wskazywać na niestatyczną metodę.

0

wskaznik na metodę ma 'bazowy' typ nie void()(), a void(Klasa::)(), wiec mozesz u siebie zastosowac np. taki wskaznik:

...
class Klasa3 {
  private:

  /* wskaźnik na funkcję typu void */
  void (Klasa2::*wskNaFunkcje)() ;
..

z tym, ze skoro to jest wsk-na-METODĘ, to wymaga ona bycia wywoływaną NA OBIEKCIE. nie uda Ci sie tego wskaznika-na-metode odpalic tak:

wskNaFunkcje(); // NIE da rady

musisz miec jakis obiekt, na ktorym ja odpalisz, i musi to byc obiekt typu klasa2 - gdyz z niej ta metoda pochodzi:

Klasa2 nowyobiektlokalny;
nowyobiektlokalny.*wskNaFunkcje(); // ok!
Klasa2* wskazniknaistniejacyobiekt = .... /*zdobadz go jakos*/;
wskazniknaistniejacyobiekt->*wskNaFunkcje(); // tez ok!
(*wskazniknaistniejacyobiekt).*wskNaFunkcje(); // to samo, inaczej zapisane

zwroc uwage na dwa dosc niecodzienne operatory: .* oraz ->*, sa to wskaznikowe odmiany dobrze znanych operatorow . i ->

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