2010-03-03 32 views
5

Tôi đã gặp vấn đề này một thời gian trước đây và tôi đã từ bỏ nhưng gần đây nó đã trở lại.Cách gọi con trỏ đến phương thức từ phương thức khác

#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; 
} 

Tôi nhận được lỗi tại dòng rõ rệt:

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

tôi sẽ thực sự biết ơn sự giúp đỡ. Có một câu hỏi tương tự hôm nay đã giúp tôi một phần: link. Nhưng nó không có vẻ là câu trả lời đầy đủ cho vấn đề của tôi.

Thực tế hai vấn đề này chỉ có một điểm khác biệt - điểm mà hàm được gọi.

Cảm ơn thời gian của bạn

Trả lời

5

"this" là một con trỏ tới node2D nhưng FunctionPtr dùng để chỉ thành viên của element2D - đó là lỗi.

# nếu 0 // phiên bản bị hỏng

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

#else // phiên bản cố định

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

#endif

Sau đó, bạn gọi nó với cái gì đó như:

myElement.myNode.otherMethod(&myElement); 

Có những thứ bạn kết hợp ld làm để cải thiện điều này, nhưng điều này sẽ giúp bạn bắt đầu.

0

Bạn cần trỏ đến đối tượng element2D nếu bạn muốn gọi con trỏ tới thành phần element2D. Cân nhắc sử dụng Boost.Function hoặc Boost.Signals2 cho chức năng bạn muốn.

Các vấn đề liên quan