2010-03-03 27 views
5

Bir süre önce bu sorunu yaşadım ve pes ettim ama son zamanlarda döndü.Başka bir yöntemden yöntem için bir işaretçi nasıl çağrılır?

#include <iostream> 

class element2D; 

class node2D 
{ 
public: 
    void (element2D::*FunctionPtr)(); 
    void otherMethod() 
    { std::cout << "hello" << std::endl; 
     ((this)->*(this->FunctionPtr))(); //ERROR<------------------- 
    } 

}; 

class element2D 
{ 
public: 
    node2D myNode; 
    void doSomething(){ std::cout << "do something" << std::endl; } 
}; 

int main() 
{ 
    element2D myElement; 

    myElement.myNode.FunctionPtr = &element2D::doSomething; //OK 
    ((myElement).*(myElement.myNode.FunctionPtr))();  //OK 

    return 0; 
} 

Ben işaretli satırında hatayı alıyorum:

pointer to member type 'void (element2D::)()' incompatible with object type 'node2D' 

yardım için gerçekten müteşekkir olacaktır. Bugün bana kısmen yardımcı olan benzer bir soru vardı: link. Ama sorunumun tam cevabı gibi görünmüyor. Aslında bu iki problemin sadece tek bir farkı vardır - bu fonksiyonun çağrıldığı noktadır. Eğer element2D üyesine bir işaretçi aramak istediğiniz takdirde

teşekkürler zaman

cevap

5

"this", node2D öğesinin bir işaretçisidir, ancak FunctionPtr, element2D öğesinin bir üyesi anlamına gelir - yani budur.

myElement.myNode.otherMethod(&myElement); 
:

gibi bir şey ile diyoruz

void otherMethod() 
{ std::cout << "hello" << std::endl; 
    ((this)->*(this->FunctionPtr))(); //ERROR<------------------- 
} 

#else // sabit versiyon

void otherMethod(element2D * that) 
{ std::cout << "hello" << std::endl; 
    ((that)->*(this->FunctionPtr))(); 
} 

Sonra

#endif kırık versiyonu // 0 #if

Yapacağınız şeyler var Bu konuda geliştirmek için yapmak, ama bu başlamanız gerekir.

0

için Sen element2D nesneye bir işaretçi gerekir. İstediğiniz işlevsellik için Boost.Function veya Boost.Signals2 kullanmayı düşünün.

İlgili konular