簡體   English   中英

如何獲得指向成員 function 的 function 指針

[英]How to get a function pointer to a member function

我正在做一個項目,我需要參與 function 指針,更具體地說是指向成員函數的 function 指針。 我已經閱讀了幾乎所有相關問題,但是沒有一個描述我的具體問題。 所以,我將嘗試通過一個簡單的例子來描述我的問題。

假設我有三個不同的 header 文件,它們具有不同的類,如下所示:

foo1.h

struct Foo1{
    int a1;
    double b1;
    
    void (Foo2::*fp)(const double);
}

foo2.h

#include "foo1.h"

class Foo2{
public:
    void print_foo2(const double p){
        cout << "From Foo2: " << p << endl;
    }
    
    Foo1 foo1;
}

foo3.h

class Foo3 : public Foo2{
    Foo1 foo1;
    
    foo1.fp = &Foo2::print_foo2; // cannot do that
}

因此,struct Foo1的成員變量之一是指向 Foo2 的成員 function 的Foo2指針,即print_foo2 出於這個原因,我創建了 object foo1的實例並為其分配了一個指向print_foo2的指針。 Class Foo3繼承自 class Foo2

我注意到,正如我所想的那樣,它可能是解決問題的有用信息。 但是,我無法獲得指向 function 的指針,因為在 struct Foo2中無法識別Foo1 即使在foo1.h foo2.h無濟於事。 如果我沒記錯的話,這是因為Foo1在構造時需要Foo2作為它的成員變量,但是同樣地Foo2需要Foo1來構造。 所以,這造成了一個僵局。

這是問題的原因嗎? 如果是,我該如何解決?

由於Foo2Foo3都需要Foo1的定義,因此它們都應該#include "foo1.h" 如果沒有Foo1的定義,編譯器將無法計算Foo2Foo3的大小。

另一方面, Foo1不需要Foo2的定義,因此可以轉發聲明Foo2來解決死鎖。 無論Foo2如何定義,它保留的指針 ( fp ) 都將具有相同的大小,這就是前向聲明就足夠的原因。

內聯評論:

// foo1.h
#pragma once

class Foo2;       // forward declaration

struct Foo1{
    int a1;
    double b1;
    
    void (Foo2::*fp)(const double);
};
// foo3.h
#pragma once

#include "foo2.h"
#include "foo1.h" // not strictly needed since `foo2.h` includes it

class Foo3 : public Foo2{

    // proper initalization:

    Foo1 foo1{1, 3.141, &Foo2::print_foo2};
};

注意:在您的代碼中, Foo2Foo3都有一個Foo1成員變量。 這意味着Foo3有 2 個。 如果您在Foo3Foo1希望Foo3在繼承的Foo2中初始化Foo1 ,則可以從Foo3中刪除Foo1成員並初始化基數 class ( Foo2 ),如下所示:

class Foo3 : public Foo2{
public:
    Foo3() : Foo2{1, 3.141, &Foo2::print_foo2} {}
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM