繁体   English   中英

在构造函数中初始化静态函数指针

[英]Initialize static function pointer in constructor

我试图将类成员函数指针声明为静态,以便可以由静态成员函数调用,并将该指针分配给传递给构造函数的函数。

到目前为止,我还无法使其正常运行,这有可能吗?

#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变量。 它们是两种不同的类型,这就是为什么代码无法编译的原因。

cbPtr typedef中删除A:: ,例如:

#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_cbptrstaticA多个实例将共享同一变量,因此您将无法为不同的A对象使用单独的回调。 如果memberFunc()不是static ,或者其aaa参数是用户定义的值(可以设置为指向A对象的this指针),则每个对象可以具有单独的回调。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM