2009-12-18 39 views
10

Sadece anlamadığım bir derleme hatası alıyorum (MS VS 2008). Birçok saat boyunca uğraştıktan sonra, her şey bulanık ve eksik olduğum çok açık (ve çok aptalca) bir şey varmış gibi hissediyorum. "Terimi 1 argüman alan bir işleve değerlendirmek değil" ok atİşaretçi-üye işlevini nasıl ararım?

typedef int (C::*PFN)(int); 

struct MAP_ENTRY 
    { 
    int id; 
    PFN pfn; 
    }; 

class C 
    { 
    ... 
    int Dispatch(int, int); 
    MAP_ENTRY *pMap; 
    ... 
    }; 

int C::Dispatch(int id, int val) 
    { 
    for (MAP_ENTRY *p = pMap; p->id != 0; ++p) 
     { 
     if (p->id == id) 
      return p->pfn(val); // <--- error here 
     } 
    return 0; 
    } 

derleyici iddialar: Aşağıda temel kod. Neden olmasın? PFN bir argüman alarak bir fonksiyon olarak prototiplenir ve MAP_ENTRY.pfn bir PFN'dir. Burada neyi özlüyorum?

+0

C sözdizimi paslıdır, bu nedenle yanıt olarak eklememelidir, "return (* (p-> pfn)) (val);"? - –

+0

Nope, "C :: PFN türünde işlenenler üzerinde" * hatası veren hata. – chrisd

+0

[Bir işlev işaretçisi aracılığıyla C++ sınıf yöntemlerini çağırma] 'nın olası kopyası (http://stackoverflow.com/questions/1485983/calling-c-class-methods-via-a-function-pointer) –

cevap

17

p->pfn değiştirin işaretçi üyeli fonksiyon tipte bir işaretçidir. Böyle bir işaretçi aracılığıyla bir işlevi çağırmak için, ->* veya operatör .* operatörünü kullanmanız ve C türünde bir nesneyi sol işlenen olarak sağlamanız gerekir. Yapmadın. Sadece bunu biliyor - - tip C amacı gerekiyordu

bilmiyorum burada kullanılacak ancak örnekte bu *this olabilir. biraz daha az dolambaçlı görünmesi amacıyla

(this->*p->pfn)(val) 

şöyle olması halinde, arama görünebilir, sen bir ara

PFN pfn = p->pfn; 
(this->*pfn)(val); 
+0

Teşekkürler. Şimdi sadece düzeltmeye sahip değilim, nedenini anlıyorum. – chrisd

8

return (this->*p->pfn)(val); 
+0

EVET !! Bu kadar. Çok teşekkürler. Sizler inanılmazsınız. Bunu saatlerce sıktım ve cevabı 10 dakikadan kısa bir sürede aldım. – chrisd

-1

p> FÇN bir işlev işaretçisi deneyin. İşe yaraması için * kullanmanız gerekir.

(*(p->pfn))(val) 
0

Kendinize bir iyilik yapın ve boost::function kullanmak değişkeni (ve destek tanıtabilir :: bind da!)

+9

"Bisikletimdeki bu çizik nereden geliyor?" - "Kendine bir iyilik yap - uçak al" –

0

bu sizin sorunuzu yanıtlamıyor, ancak boost :: function ve boost :: bind'in yerine kullanmayı düşünün. Kod tabanınıza oldukça büyük bağımlılık getirir, ancak daha büyük projeler için buna değer.

1

Sadece kendi deneyimi ile uymak, bu açıklamanın neden olduğu g ++ 'da hata rastlamak ettik: stateHandler * tarafından başvurulan sınıfın bir boşluk üyesi işlev işaretçisi olan

(this -> *stateHandler)() ; 

bu. Sorun, ok operatörü arasındaki boşluklardan kaynaklandı. Aşağıdaki kod parçasında ince derler:

(this->*stateHandler)() ; 

ben g kullanıyorum ++ (GCC) 4.4.2 20090825 (yayın öncesi). FWIW.

İlgili konular