Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 初始化构造函数中的静态函数指针_C++_C++11 - Fatal编程技术网

C++ 初始化构造函数中的静态函数指针

C++ 初始化构造函数中的静态函数指针,c++,c++11,C++,C++11,我试图将类成员函数指针声明为静态的,以便静态成员函数可以调用它,并将指针分配给传递给构造函数的函数 到目前为止我还没能让它工作,这有可能吗 #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 p

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

到目前为止我还没能让它工作,这有可能吗

#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;
}
cbPtr类型需要指向类的非静态成员函数的指针。但您正试图将指向非成员函数的指针分配给静态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;
}
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是静态的,所以A的多个实例将共享同一个变量,因此您将无法对不同的A对象进行单独的回调。若memberFunc不是静态的,或者它的a或aa参数是一个用户定义的值,可以设置为指向a对象的this指针,那个么您可以对每个对象有一个单独的回调。

a::cbPtr类型需要一个指向类的非静态成员函数的指针。但您正试图将指向非成员函数的指针分配给静态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;
}
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是静态的,所以A的多个实例将共享同一个变量,因此您将无法对不同的A对象进行单独的回调。如果memberFunc不是静态的,或者如果其a或aa参数是用户定义的值,可以设置为指向对象的this指针,然后,您可以对每个对象进行单独的回调。

静态成员无权访问对象的特定实例。静态成员无权访问对象的特定实例。还建议:std::function?如果使用C++11或更高版本,则是。但是这个问题并没有被贴上这样的标签。这是有效的!我有一个问题,我有点C++,这是什么?A::cbPtr A::cbPtr=NULL doing,我可以搜索一个术语来更好地理解吗?@oraz cbPtr是类型,m_cbPtr是对象,A::是查找cbPtr和m的命名空间_cbptr@oraz:如果已将代码分隔为.h和.cpp文件,静态声明将放在.h文件中,变量定义将放在.cpp文件中。但是,在您的示例中,您将所有内容都放在一个文件中,但这不会改变需求。您仍然需要在某个地方定义变量。我更新了我的答案来说明这一点。还建议:std::function?如果使用的是C++11或更高版本,则是。但是这个问题并没有被贴上这样的标签。这是有效的!我有一个问题,我有点C++,这是什么?A::cbPtr A::cbPtr=NULL doing,我可以搜索一个术语来更好地理解吗?@oraz cbPtr是类型,m_cbPtr是对象,A::是查找cbPtr和m的命名空间_cbptr@oraz:如果已将代码分隔为.h和.cpp文件,静态声明将放在.h文件中,变量定义将放在.cpp文件中。但是,在您的示例中,您将所有内容都放在一个文件中,但这不会改变需求。您仍然需要在某个地方定义变量。我更新了我的答案来说明这一点。