我正在使用 c/c++ 的混合来模仿面向对象的实践。这是一个家庭作业,我不喜欢这个答案,但也许是一个可以找到它的地方。
我们被分配去创造:
1) 通用结构
2) 这个结构能够容纳任何类型的数据成员
3) 这个结构体可以容纳任何函数
正如我的老师所解释的那样,我们将把数据成员、它们的名称、函数和它们的名称保存在四个单独的 vector 中。我已经有类似的东西了
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 *) 但由于这是我第一次涉足函数指针池,任何人都可以指出我可能需要查看的方向吗?谢谢
最佳答案
根据您的评论重写:
你有一个表单的函数
void* myFunction(GeneralClass& gc, void 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 程序员来说也很难阅读。更好的解决方案是使用 typedef 在可理解的阶段构建它。
typedef void* MyFunctionType(GeneralClass& gc, void v);
typedef MyFunctionType *PtrToMyFunctionType;
typedef void AddFunctionType(PtrToMyFunctionType);
typedef AddFunctionType *PtrToAddFunctionType;
然后将结构中的字段声明为
PtrToAddFunctionType ptrToAddFunctionType;
你就完成了。这种方法的巨大优势之一是,在大多数情况下,一些或所有中间类型也将变得有用。
希望这次我没听错。如果没有,我想我已经给了你足够的信息来让你解决你实际处理的问题。
关于c++ - c/c++中用函数指针模仿OO,如何存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21766503/