【问题标题】:Imitating OO with function pointers in c/c++, how to store them?c/c++中用函数指针模仿OO,如何存储?
【发布时间】:2014-02-13 22:03:30
【问题描述】:

我正在使用混合 c/c++ 来模仿面向对象的实践。这是一个家庭作业,我喜欢这个答案,但也许可以找到它的位置。

我们被分配去创造:

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 *) 但由于这是我第一次涉足函数指针池,任何人都可以指出我可能需要查看的方向吗?谢谢

【问题讨论】:

  • 我只是很好奇为什么你的老师认为这是一个理智/重要的学习...
  • @olevegard 请,这只是题外话。我目前正在使用嵌入 lua,这是一个非常相似的情况。这是一个用例。
  • '模仿 OO'??这意味着什么,为c++ vtable 代理提供简单的c 函数指针放在struct 声明中?你可以在c面向对象编程相当好,没有什么模仿它!!
  • @olevegard - 这只是一个教我们函数指针的练习和函数式编程的介绍 πάνταῥεῖ - 请参阅我的其他评论,这只是学习函数指针及其工作原理的一课。
  • +1 这是一个关于 c++ 原理的完全有效的问题。不知道为什么这么多人笑。

标签: c++ c pointers struct


【解决方案1】:

用你的 cmets 重写这个:

你有表单的功能

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;

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

希望这次我正确理解了您。如果没有,我想我已经为您提供了足够的信息来让您解决您实际处理的问题。

【讨论】:

  • 我正在寻找与您刚刚键入的内容类似的形式,除了我的结构中需要一个函数指针,它指向一个添加 void* ()(GeneralClass& gc , void v) 结构体向量的函数
  • 注意:我是作为 C 程序员来处理这个问题的,因为您说的是“指针”而不是“引用”——除了您在问题描述中包含的 GeneralClass 引用。但我所阐述的原则也应该适用于 C++。
猜你喜欢
  • 2011-02-02
  • 2020-08-21
  • 2019-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多