亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過函數指針調用C+類方法

通過函數指針調用C+類方法

C++
富國滬深 2019-07-03 16:09:32
通過函數指針調用C+類方法如何獲得類成員函數的函數指針,然后使用特定對象調用該成員函數?我想寫:class Dog : Animal{     Dog ();     void bark ();}…Dog* pDog = new Dog ();BarkFunction pBark = &Dog::bark;(*pBark) (pDog);…此外,如果可能的話,我還想通過指針調用構造函數:NewAnimalFunction pNew = &Dog::Dog;Animal* pAnimal = (*pNew)();這是可能的嗎?如果可能的話,最好的方法是什么?
查看完整描述

3 回答

?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

朗讀,閱讀這,這個詳情:

// 1 define a function pointer and initialize to NULLint (TMyClass::*pt2ConstMember)(float, char, char) const = NULL;
// C++class TMyClass{public:
   int DoIt(float a, char b, char c){ cout << "TMyClass::DoIt"<< endl; return a+b+c;};
   int DoMore(float a, char b, char c) const
         { cout << "TMyClass::DoMore" << endl; return a-b+c; };

   /* more of TMyClass */};pt2ConstMember = &TMyClass::DoIt; // note: <pt2Member> may also legally point to &DoMore
   // Calling Function using Function Pointer(*this.*pt2ConstMember)(12, 'a', 'b');


查看完整回答
反對 回復 2019-07-03
?
翻過高山走不出你

TA貢獻1875條經驗 獲得超3個贊

如何獲得類成員函數的函數指針,然后使用特定對象調用該成員函數?

最簡單的方法是從typedef..對于成員函數,可以在類型聲明中添加類名:

typedef void(Dog::*BarkFunction)(void);

然后,要調用該方法,請使用->*操作員:

(pDog->*pBark)();

此外,如果可能的話,我也希望通過指針調用構造函數。這是可能的嗎?如果可能的話,最好的方法是什么?

我不相信你能和這樣的構造器一起工作-函數和函數是特別的。實現這類任務的正常方法是使用工廠方法,它基本上只是一個靜態函數,它為您調用構造函數。有關示例,請參閱下面的代碼。

我已經修改了你的代碼來做你所描述的。下面有一些警告。

#include <iostream>class Animal{public:

    typedef Animal*(*NewAnimalFunction)(void);

    virtual void makeNoise()
    {
        std::cout << "M00f!" << std::endl;
    }};class Dog : public Animal{public:

    typedef void(Dog::*BarkFunction)(void);

    typedef Dog*(*NewDogFunction)(void);

    Dog () {}

    static Dog* newDog()
    {
        return new Dog;
    }

    virtual void makeNoise ()
    {
        std::cout << "Woof!" << std::endl;
    }};int main(int argc, char* argv[]){
    // Call member function via method pointer
    Dog* pDog = new Dog ();
    Dog::BarkFunction pBark = &Dog::makeNoise;

    (pDog->*pBark)();

    // Construct instance via factory method
    Dog::NewDogFunction pNew = &Dog::newDog;

    Animal* pAnimal = (*pNew)();

    pAnimal->makeNoise();

    return 0;}

現在,盡管您通常可以使用Dog*代替Animal*由于多態的魔力,函數指針的類型遵循類層次結構的查找規則。因此,動物方法指針與Dog方法指針不兼容,換句話說,您不能分配Dog* (*)()類型變量Animal* (*)().

靜電newDog方法是一個工廠的簡單示例,它簡單地創建并返回新實例。作為一個靜態函數,它有一個正則函數。typedef(沒有類限定符)。

在回答了上述問題后,我想知道是否沒有更好的方法來達到你所需要的。有一些特定的場景,您可以這樣做,但您可能會發現,還有其他模式更適合您的問題。如果你用更籠統的語言來描述你想要達到的目標,蜂巢思維可能會更有用!

與上述相關,您無疑會發現升壓綁定庫和其他相關模塊非常有用。


查看完整回答
反對 回復 2019-07-03
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

我想沒有人在這里解釋過,有一個問題是你需要“成員指針“而不是普通函數指針。

函數的成員指針不僅僅是函數指針。在實現方面,編譯器不能使用簡單的函數地址,因為通常,只有知道要取消引用的對象(比如虛擬函數),才知道要調用的地址。您還需要知道對象,以便提供this當然是隱式參數。

說過你需要它們,現在我要說你真的需要避免它們。說真的,會員指點是一種痛苦。查看實現相同目標的面向對象的設計模式,或者使用boost::function或者上面提到的任何事情-假設你可以做出這個選擇,也就是說。

如果要向現有代碼提供函數指針,那么您真的需要作為一個簡單的函數指針,您應該將一個函數作為類的靜態成員來編寫。靜態成員函數不理解this,因此需要將對象作為顯式參數傳入。曾經有一個不尋常的習語,用于處理需要函數指針的舊C代碼。

class myclass{
  public:
    virtual void myrealmethod () = 0;

    static void myfunction (myclass *p);}void myclass::myfunction (myclass *p){
  p->myrealmethod ();}

myfunction實際上只是一個普通函數(范圍問題除外),函數指針可以用普通的C方式找到。

編輯-這種方法稱為“類方法”或“靜態成員函數”。與非成員函數的主要區別在于,如果從類外部引用它,則必須使用::范圍解析算子例如,要獲取函數指針,請使用&myclass::myfunction把它叫做“使用”myclass::myfunction (arg);.

這種情況在使用舊的Win 32 API時相當常見,這些API最初是為C而不是C+設計的。當然,在這種情況下,參數通常是LPARAM或類似的,而不是指針,并且需要進行一些轉換。


查看完整回答
反對 回復 2019-07-03
  • 3 回答
  • 0 關注
  • 560 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號