2015-10-16 235 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()功能僅頭部實現,以便在不同編譯器之間實現更好的可移植性。