[英]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
來構造。 所以,這造成了一個僵局。
這是問題的原因嗎? 如果是,我該如何解決?
由於Foo2
和Foo3
都需要Foo1
的定義,因此它們都應該#include "foo1.h"
。 如果沒有Foo1
的定義,編譯器將無法計算Foo2
和Foo3
的大小。
另一方面, 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};
};
注意:在您的代碼中, Foo2
和Foo3
都有一個Foo1
成員變量。 這意味着Foo3
有 2 個。 如果您在Foo3
而Foo1
希望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.