在c++类中直接包装函数

Direct wrapper to function in C++ class

本文关键字:包装 函数 c++      更新时间:2023-10-16

我正试图使一个函数可以被称为类成员。下面是一些代码:

#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;
}

最终,函数将在dll或库中结束。参见http://ideone.com/csueum编译失败,错误信息如下:

prog.cpp: In constructor 'CTest::CTest()':
prog.cpp:12:18: error: class 'CTest' does not have any field named 'sum'
  CTest() : i(0), sum(CTestSum)

我做错了什么?

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然后可以实现和导出CTestSum()函数的需要,并且您的CTest类可以是一个头文件的实现,以便更好地跨不同的编译器的可移植性。