用c / c ++中的函数指针模仿OO,如何存储它们?

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;

你完成了。这种方法的一个巨大优势是,在大多数情况下,一些或所有中间类型也会变得有用。

希望这次我能正确理解你。如果没有,我想我已经给了你足够的信息,让你解决你实际正在处理的问题。