gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:24:08 28 4
gpt4 key购买 nike

我正在使用 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com