2011-08-16 18 views
10

Bir işlevi başka bir işleve parametre olarak aktarmaya çalışıyorum ve her ikisi de aynı sınıfın üye işlevleri oluyor.C++: İşlev işlevlerini üye işlevleriyle kullanma

Tuhaf bir hata alıyorum ve sorunun ne olduğunu anlayamıyorum.

İşte benim işlevler şunlardır:

void myClass::functionToPass() 
{ 
    // does something 
} 

void myClass::function1(void (*passedFunction)()) 
{ 
    (*passedFunction)(); 
} 

void myClass::function2() 
{ 
    function1(&myClass::functionToPass); 
} 

Ancak, aşağıdaki hatayı alıyorum:

cannot convert parameter 1 from 'void(__thiscall myClass::*) (void)' 
    to 'void(__cdecl*)(void)' 

Yani ne oluyor? Bunu çalışmaya çalışmak için her çeşit denemeyi denediğimi hissediyorum. Üye işlevler için işlev işaretçileri bile iletebilir misiniz? Bunu nasıl çalıştırabilirim?

Not: İşlev oluşturma Statik statik gerçekten geçerli bir seçenek değildir.

+0

Hata iletisi, sorunu gidermek için gereken tüm bilgileri verir. –

+0

"boost :: function" işlevini kullanmak, işlev işaretleyicilerini kullanmaktan daha kolay olabilir. "Boost :: function " (bu durumda '' function2' 'nun' 'bu '' ya da 'boost :: function ' (bu durumda 'function1' işlevine sahip olması gerekir) işlevinin olup olmadığını kontrol etmeniz gerekir. – MSalters

cevap

11

İşlev göstergelerini üye işlevlerine geçirebilirsiniz. Ama bu senin kodun yaptığı şey değil. Normal işlev işaretçileri (void (*passedFunction)(), normal bir işlev işaretçisi) ve üye işlevlerine işaretçiler (&myClass::functionToPass üye işlevinin bir işaretçisidir) arasında karıştırılır. Onlar aynı şey değiller ve uyumlu değiller.

Şimdi kodunuzu üye işlevlerine işaretçileri kullanıyor bu

void myClass::function1(void (myClass::*passedFunction)()) 
{ 
    (this->*passedFunction)(); 
} 

gibi kodunuzu yeniden yazabilirsiniz, ama tabii ki bu normal bir işlev işaretçisi geçmek mümkün olmayacaktır demektir.

+0

Anlamlıdır! Bunu yarına kadar test etme şansım yok ama eğer işe yararsa kesinlikle bir kabul vereceğim. –

+1

İşlev İşaretçisi Eğitimi: http://www.newty.de/fpt/index.html (çok kullanışlı) –

1

Başkaları tarafından da belirtildiği gibi, hatanız iletilmekte olan işlev işaretçisinin türündedir. void (myClass::*passedFunction)() olmalıdır.

C++ 'da üye işlevlerinin işaretçileri kullanılarak iyi bir tutorial.

+0

, bu "iş" in bazı değişikliklerini kullanabilmeli? –

+0

Maalesef, işlev işaretçisini aynı sınıfa ait bir üye işlevine geçtiğinizi özledim. Bunu başka bir işleve aktardığınızı sanıyordum, bu durumda, "geçtiFunction" ile işaret edilen işlevi çağırmak için "myClass" nesnesine ihtiyacınız olacaktır. – Dima