的A::cbPtr
類型期望的指針A
類的非靜態成員函數。但是,您正試圖將一個指向非成員函數的指針指定給您的靜態變量cbptr
。它們是兩種不同的類型,這就是代碼不能編譯的原因。
降A::
從cbPtr
的typedef,例如:
#include <stdio.h>
//external callback function
static void innerFunc(int i, float f)
{
printf("running inner function : %i %f\n", i, f);
}
class A
{
public:
// non-member function pointer
typedef void (*cbPtr)(int, float);
//constructor
A(cbPtr func)
{
m_cbptr = func;
}
void run()
{
memberFunc(5, 4.4, NULL, NULL);
}
private:
static cbPtr m_cbptr;
// static member function
static void memberFunc(int i, float f, void* a, const void* aa)
{
printf("running outer function.\n");
m_cbptr(i, f);
}
};
A::cbPtr A::m_cbptr = NULL;
int main()
{
A a(innerFunc);
a.run();
return 0;
}
當你學會如何在聲明和定義分成.h
和.cpp
文件,它看起來更像是這個:
啊:
#ifndef A_H
#define A_H
class A
{
public:
// non-member function pointer
typedef void (*cbPtr)(int, float);
//constructor
A(cbPtr func);
void run();
private:
static cbPtr m_cbptr;
// static member function
static void memberFunc(int i, float f, void* a, const void* aa);
};
#endif
A.cpp:
#include "A.h"
#include <stdio.h>
A::cbPtr A::m_cbptr = NULL;
A::A(A::cbPtr func)
{
m_cbptr = func;
}
void A::run()
{
memberFunc(5, 4.4, NULL, NULL);
}
void A::memberFunc(int i, float f, void* a, const void* aa)
{
printf("running outer function.\n");
m_cbptr(i, f);
}
main.cpp中:
#include "A.h"
#include <stdio.h>
//external callback function
static void innerFunc(int i, float f)
{
printf("running inner function : %i %f\n", i, f);
}
int main()
{
A a(innerFunc);
a.run();
return 0;
}
無論哪種方式,只知道因爲m_cbptr
是static
的A
多個實例將共享相同的變量,所以你將不能夠有獨立的回調不同的A
對象。如果memberFunc()
不是static
,或者其a
或aa
參數是一個用戶定義的值,可以將其設置爲指向A
對象的this
指針,則可以爲每個對象分別設置一次回調。
靜態成員無權訪問對象的特定實例。 –