在构造函数中初始化静态函数指针
我想声明一个类成员函数指针,因为它可以被静态成员函数调用,并将指针指派给传递给构造函数的函数。在构造函数中初始化静态函数指针
到目前为止,我还没有能够得到它的工作,这是否有可能?
#include <stdio.h>
//external callback function
static void innerFunc(int i, float f){
printf("running inner function : %i %f\n", i, f);
}
class A{
// member function pointer
typedef void (A::*cbPtr)(int, float);
static cbPtr cbptr;
public:
//constructor
A(void(*func)(int, float))
{
A::cbptr = func; // < this doesn't work
}
void run()
{
memberFunc(5, 4.4, NULL, NULL);
}
private:
// static member function
static void memberFunc(int i, float f, void* a, const void* aa)
{
printf("running outer function.\n");
// cbptr(i, f); // << I want to be able to call the function here
}
};
int main() {
A a(innerFunc);
a.run();
return 0;
}
的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
指针,则可以为每个对象分别设置一次回调。
也建议:'std :: function
如果使用C++ 11或更高版本,是的。但这个问题没有被标记为这样。 –
工作正常!我有一个问题,我有点C++ noob这是什么? A :: cbPtr A :: cbptr = NULL在做,是否有一个术语可以搜索以获得更好的理解? – oraz
静态成员无权访问对象的特定实例。 –