2015-10-16 197 views
0

我想做一个可以作为类成员调用的函数。这里是一些代码:直接包装函数在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; 
} 

最终,该函数将最终在一个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) 

我在做什么错?

+0

C++中的变量类型永远不能是函数类型。你的'CTest :: sum'是一个成员函数,而不是数据成员。 –

+0

使用std :: function –

+0

我知道,但是当'sum'是指向函数的指针时,它没有指向类实例的指针,因为它没有作为方法解析,而是作为变量解析。当我调用''instance.sum(2,4)''时,程序只推送4和2,不包括指向栈上的类实例的指针。 – bajos

回答

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,然后可以根据需要,你的CTest类可以是实现和导出CTestSum()功能仅头部实现,以便在不同编译器之间实现更好的可移植性。