Kod

class cat{

        public:
           void walk(){
                printf("cat is walking \n");
           }

           void myAbc(){
               void (*pKoo)();
               pKoo = &this->walk;
           }

          void myDef(){
               void(cat::*pFoo)();
               pFoo = &this->walk;
          }
        }

    };

Wynik

  1. nieważne (*pKoo)(); - Nie ma problemu
  2. pKoo = &this->spacer; - Błąd kompilacji
  3. void(kot::*pFoo)(); - Nie ma problemu
  4. pFoo = &this->spacer; - błąd kompilacji;

Pytanie

  • Dlaczego nie 2 niemożliwe? Jeśli niemożliwe, to jaki jest pożytek z nr 1?
  • Dlaczego nie 4 niemożliwe? Jeśli niemożliwe, to jaki jest pożytek z nr 3?

Proszę o pomoc dla wyjaśnienia pojęciowego. Dziękuję Ci

0
Nayana Adassuriya 29 sierpień 2012, 13:51

2 odpowiedzi

Najlepsza odpowiedź

Dlaczego nie 2 niemożliwe?

Mój kompilator wyświetla komunikat o błędzie:

cannot convert ‘void (cat::*)()’ to ‘void (*)()’ in assignment

Co oznacza, że ​​nie można przekonwertować wskaźnika do funkcji elementu członkowskiego na wskaźnik do funkcji. Są to typy niezgodne; wskaźnik do funkcji można wywołać bezpośrednio, podczas gdy funkcja wskaźnika do elementu członkowskiego musi być zastosowana do obiektu. Tak więc typ, do którego przypisujesz, musi być funkcją wskaźnika do elementu członkowskiego lub void (cat::*)();, jak poprawnie używasz w 3.

Jeśli niemożliwe, to jaki jest pożytek z nr 1?

Służy do przechowywania wskaźnika do funkcji statycznej lub niebędącej członkiem.

Dlaczego nie 3 niemożliwe?

(Zakładam, że masz na myśli 4, a nie 3.) Mój kompilator wyświetla komunikat o błędzie:

ISO C++ forbids taking the address of a bound member function to form a 
pointer to member function.  Say ‘&cat::walk’

Z jakiegoś powodu nie możesz pobierać adresu funkcji składowej za pomocą obiektu (lub wskaźnika); musisz zamiast tego użyć nazwy klasy. Możemy tylko spekulować, dlaczego nie jest to dozwolone; być może dlatego, że nie jest do końca jasne, które nadpisanie należy wybrać, jeśli jest to wirtualne, a może z jakiegoś innego powodu.

Niezależnie od powodu, użyj dozwolonej składni: pFoo = &cat::walk;

2
Mike Seymour 3 wrzesień 2012, 17:29
void (*pKoo)();                
pKoo = &this->walk; 

Wyświetla błąd, ponieważ typ wskaźnika funkcji nie jest zgodny z typem funkcji, której adres do niej przypisujesz.

Typ walk() to:

void (cat::*)(void);

void(cat::*pFoo)();
pKoo = &this->walk; 

Powinien być:

pKoo = &cat::walk;

Metoda walk należy do klasy cat, a nie do żadnej konkretnej instancji klasy. Dlatego nie możesz użyć this->walk(), ale musisz zakwalifikować nazwę metody do nazwy klasy.

2
Alok Save 29 sierpień 2012, 14:02