2017-08-04 64 views
-2

我試圖從另一個類設置成員函數的指針,但是我不能弄清楚如何做到這一點。我有三個類:控制,按鈕,文本框。按鈕和文本框有自己的void _Draw(),並且Control類有一個指向void(* drawFunc(int))的指針從不兼容類型'void(Button :: *)(int)'分配給'void(*)(int)'

我希望Button和Textbox類有權訪問Control _drawFunc指針,將它設置爲_Draw功能。

void Draw1(int t) { 
    printf("%d\n", t); 
} 

struct Control { 
    void (*drawFunc)(int); 

    Control() {} 
}; 

struct Button : Control{ 

    void _Draw(int m) { 
     // ... 
    } 

    Button() { 
     drawFunc = &Button::_Draw; // Draw1 works fine 
    } 

}; 

struct Textbox : Control{ 

    void _Draw(int m) { 
     // ... 
    } 

    Textbox() { 
     drawFunc = &Textbox::_Draw; // Draw1 works fine 
    } 

}; 
+1

'void(* drawFunc)(int)'不是指向成員函數的指針。它是一個指向常規(獨立)功能的指針。會員職能和常規職能是完全不同性質的野獸。你不能讓'drawFunc'指向'Button :: _ Draw'。 – AnT

+0

指向函數的指針和指向成員函數的指針是不同的類型。 –

+1

另請注意,名稱以'_開頭,後跟'A-Z'保留,不應使用。 – HolyBlackCat

回答

0

你可以使用function<void(int)> drawFunc代替void (drawFunc*)(int)[this](int i) { this->_Draw(m); }分配給它綁定,或者你讓靜態的(這沒有意義),但對於這樣的問題有虛擬方法:

struct Control { 
    virtual void draw(int) = 0; 

    Control() {}; 
    virtual ~Control() {}; 
}; 

struct Button : public Control { 
    void draw(int m) final override { // final is optional: if there are no subclasses of buttons 
     // ... 
    }; 
}; 
相關問題