2014-02-13 39 views
2

我模仿使用混合c/C++的面向對象的做法。這是一個作業分配和我會不是喜歡的答案,但也許是一個位置找到它。在c/C++中用函數指針模仿OO,如何存儲它們?

我們被分配給創建:

1)的一般結構

2)這個結構能夠保持任何類型的數據成員的

3)這個結構能夠保持任何功能


正如我的老師解釋的那樣,我們將把數據成員,他們的名字,函數和他們的名字保存到四個獨立的向量中。我已經有類似的東西

struct GenericClass 
{ 
    vector < void*(*)(GenericClass& gc, void* p) > funcs; //A void pointer whose parameters are a void pointer 
    vector <string> funcsNames; //Name of the function (void pointer) 

    vector < void* > data; 
    vector <string> dataNames; 

我們需要能夠添加函數到「funcs」中。我們應該能夠添加的函數必須:1)返回一個(void *)和2)將(void *)作爲參數放入函數中。我寫了一個函數來做到這一點,但它是不完整的

void addFunction(GenericClass& gc, void* (*fn)(GenericClass& gc, void* v), string name) 
{ 
    gc.funcs.push_back(*fn); //?? 
    gc.funcsNames.push_back(name); 
    return; 
} 

我知道我必須添加到「gc.funcs」一個函數指針是誰能夠有一個(void *)列可選參數(顯然我不希望這個函數內?),它返回一個(void *),但因爲這是我在函數指針池中的第一個wade,任何人都可以指向我可能需要查看的方向嗎?謝謝

+2

我只是好奇你的老師爲什麼認爲這是一個理智的/重要的事情學習...... – olevegard

+2

@olevegard請,這只是一個主題。我目前正在嵌入lua,這是非常相似的情況。這是一個用例。 –

+1

_'Ioating OO'_ ??這應該是什麼意思,提供[tag:C++] vtable替代項,放置在'struct'聲明中的plain [tag:c]函數指針?您可以在[tag:c]中很好地執行**面向對象的編程,沒有關於它的模擬_ !! –

回答

1

在您的意見方面,改寫本:

你有形式

無效* myFunction的(GeneralClass & GC,空隙V)的功能;

並且您想寫一個指向新函數的指針,該函數將接受指向此函數的指針作爲參數。

讓我們先用力去做。指針給myFunction將是形式

void* (*ptrToMyFunction)(GeneralClass& gc, void v); 

這需要該指針作爲參數(和返回void)的函數將具有形式

void addFunction(void* (*ptrToMyFunction)(GeneralClass& gc, void v)); 

而一個指針,它指向函數將有表格

void (*ptrToAddFunction)(void* (*ptrToMyFunction)(GeneralClass& gc, void v)); 

...即使是經驗豐富的C程序員也難以閱讀。更好的解決方案是使用typedefs在可理解的階段進行構建。

typedef void* MyFunctionType(GeneralClass& gc, void v); 
typedef MyFunctionType *PtrToMyFunctionType; 
typedef void AddFunctionType(PtrToMyFunctionType); 
typedef AddFunctionType *PtrToAddFunctionType; 

然後在你的結構聲明字段

PtrToAddFunctionType ptrToAddFunctionType; 

就大功告成了。這種方法的巨大優勢之一是,在大多數情況下,部分或全部中間類型也將變得有用。

希望我這次正確理解了你。如果沒有,我想我已經給了你足夠的信息,讓你解決你實際處理的問題。

+0

我正在尋找類似的形式,除了我需要在我的結構中的函數指針,指向一個函數,該函數添加一個void *(*)(GeneralClass&gc,void * v)函數結構的vector – Zac

+1

注意:由於您說的是「指針」而不是「引用」,因此我將此作爲C程序員來處理,除了您在問題描述中包含的GeneralClass引用之外。但是我所說明的原則也應該適用於C++。 – keshlam