2011-10-15 36 views
6

C++ üye işlev işaretleyicilerini arama ve yapılarda işaretçi çağırma hakkında bilgi buldum, ancak bir yapının içinde varolan bir üye işlev işaretçisini çağırmam gerekiyor. sözdizimini doğru yaz.Bir yapıdan C++ üye işlev işaretçisi çağırma

void MyClass::run() { 
    struct { 
     int (MyClass::*command)(int a, int b); 
     int id; 
    } functionMap[] = { 
     {&MyClass::commandRead, 1}, 
     {&MyClass::commandWrite, 2}, 
    }; 

    (functionMap[0].MyClass::*command)(x, y); 
} 

int MyClass::commandRead(int a, int b) { 
    ... 
} 

int MyClass::commandWrite(int a, int b) { 
    ... 
} 

Bu bana verir: Ben class Sınıfım bir yöntemin içinde aşağıdaki pasajı var. Kullanarak öneren sözdizimi hataları sonuçların etrafında olanlar parantez Hareketli

error: expected unqualified-id before '*' token 
error: 'command' was not declared in this scope 
(referring to the line '(functionMap[0].MyClass::*command)(x, y);') 

* ya -> * ikisi de çalışma içinde bu durumda. Doğru sözdizimini bilen var mı?

+0

http://stackoverflow.com/questions/990625/c-function-pointer-class-member-to-non-static-member-function bu soruyla ilişkili görünüyor. – Rudi

cevap

8

Kullanım:

(this->*functionMap[0].command)(x, y); 

Test ve derler ;

+0

Ah mükemmel! Yanıtınız için teşekkürler ve yukarıdaki cevap akıl yürütmeyi sağlar. – aaron

5

Hiçbir kod derlemedim, ancak bakmadan sadece birkaç şeyi kaçırdığınızı görebiliyorum.

  • MyClass:: işlev işaretçisini çağırdığınız yerden kaldırın.
  • this işaretçisini işlevlere (örneğin, herhangi bir örnek verisi kullandıysa) iletmeniz gerekir; bu, onu çağırmak için MyClass örneğine ihtiyacınız olduğu anlamına gelir.

(sonra biraz araştırma) böyle bir şey (@VoidStar da teşekkürler) yapmak gerekir gibi görünüyor:

(this->*(functionMap[0].command)(x, y)); 
+0

Açıklama için teşekkürler. Aşağıdaki yanıt ('functionMap' yerine 'this' de dahil olmak üzere) parantez ile çalışır. Yanıt için teşekkür ederiz. – aaron

+0

Tam olarak gerekip gerekmediğinden emin değildim.Ancak bu problem için muhtemelen farklı bir çözüm denemeliyim. Sadece bir if kullanarak veya daha fazla esneklik bir çeşit Komut kalıbı gerektiriyorsa, – Daemin

İlgili konular