直接包装器在C++类中的作用

直接包装器在C++类中的作用,c++,linux,windows,dynamic-library,C++,Linux,Windows,Dynamic Library,我正在尝试创建一个可以作为类成员调用的函数。下面是一些代码: #include <iostream> using namespace std; class CTest; void CTestSum(CTest* ptr, int a, int b); class CTest{ public: int i; void sum(int a, int b); CTest() : i(0), sum(CTestSum) { } }; void C

我正在尝试创建一个可以作为类成员调用的函数。下面是一些代码:

#include <iostream>
using namespace std;

class CTest;
void CTestSum(CTest* ptr, int a, int b);

class CTest{
public:
    int i;
    void sum(int a, int b);
    CTest() : i(0), sum(CTestSum)
    {
    }
};

void CTestSum(CTest* ptr, int a, int b)
{
    ++ptr->i;
    cout << (ptr->i)+a+b << endl;   
}

int main() {
    CTest instance;
    instance.sum(2, 4);

    return 0;
}
我做错了什么?

sum不是类的数据成员,因此无法在构造函数的成员初始化列表中初始化它。不需要初始化sum,只需给它一个根据需要调用实函数的体,例如:

#include <iostream>

using namespace std;

class CTest;
void CTestSum(CTest* ptr, int a, int b);

class CTest{
public:
    int i;
    void sum(int a, int b) { CTestSum(this, a, b); }
    CTest() : i(0)
    {
    }
};

void CTestSum(CTest* ptr, int a, int b)
{
    ++ptr->i;
    cout << (ptr->i)+a+b << endl;   
}

int main() {
    CTest instance;
    instance.sum(2, 4);

    return 0;
}

您的DLL可以根据需要实现和导出CtStUM函数,而CCDASE类可以是一个只针对不同编译器更好的可移植性的头文件实现。C++中的变量类型永远不能是函数类型。您的CTest::sum是一个成员函数,而不是一个数据成员。我知道,当sum是指向函数的指针时,它没有指向类实例的指针,因为它不是作为方法而是作为变量解析的。当我调用instance.sum2,4时,程序只推送了4和2,不包括指向堆栈上类实例的指针。

#include <iostream>

using namespace std;

class CTest;
void CTestSum(CTest* ptr, int a, int b);

class CTest{
public:
    int i;
    void sum(int a, int b) { CTestSum(this, a, b); }
    CTest() : i(0)
    {
    }
};

void CTestSum(CTest* ptr, int a, int b)
{
    ++ptr->i;
    cout << (ptr->i)+a+b << endl;   
}

int main() {
    CTest instance;
    instance.sum(2, 4);

    return 0;
}