Imitating OO with function pointers in c/c++, how to store them?
我使用C/C++的混合来模仿面向对象的实践。这是一个家庭作业,我不想答案,但可能是一个地点找到它。
我们被指派创建:
1)一般结构
2)此结构能够保存任何类型的数据成员
3)此结构能够容纳任何函数
正如我的老师解释的,我们将把数据成员、他们的名字、函数和他们的名字放在四个独立的向量中。我已经有类似的东西了
1 2 3 4 5 6 7 | 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*)作为函数的参数。我已经编写了一个函数来完成这个操作,尽管它还不完整
1 2 3 4 5 6 | 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*),但由于这是我在函数指针池中的第一个步骤,所以是否有人能将我指向可能需要查看的方向?谢谢你
根据您的评论重写:
你有这种形式的功能
void*myfunction(GeneralClass&gc,void v);
你想写一个指向一个新函数的指针,这个函数接受一个指向这个函数的指针作为参数。
我们先硬着头皮做吧。指向MyFunction的指针的形式为
1 | void* (*ptrToMyFunction)(GeneralClass& gc, void v); |
将该指针作为参数(并返回void)的函数将具有以下形式
1 | void addFunction( void* (*ptrToMyFunction)(GeneralClass& gc, void v) ); |
号
指向该函数的指针将具有
1 | void (*ptrToAddFunction)( void* (*ptrToMyFunction)(GeneralClass& gc, void v) ); |
…即使对于一个有经验的C程序员来说也很难阅读。更好的解决方案是使用typedef在可理解的阶段构建它。
1 2 3 4 | typedef void* MyFunctionType(GeneralClass& gc, void v); typedef MyFunctionType *PtrToMyFunctionType; typedef void AddFunctionType(PtrToMyFunctionType); typedef AddFunctionType *PtrToAddFunctionType; |
。
然后将结构中的字段声明为
1 | PtrToAddFunctionType ptrToAddFunctionType; |
你完成了。这种方法的一个巨大优势是,在大多数情况下,一些或所有中间类型也会变得有用。
希望这次我能正确理解你。如果没有,我想我已经给了你足够的信息,让你解决你实际正在处理的问题。