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

标签 c++ c pointers struct

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

相关文章:

c++ - 'unrelated types' 之间的 static_cast

调用以结构为参数的C函数

c - ncurses 应用程序中的 sleep()

PHP 从特定位置 append 到文件

c++ - unique_ptr 可以采用 nullptr 值吗?

c++ - 如何绑定(bind)两个元组?

c++ - 从 C++ 到 MySQL 到 C++ 获取和设置 wchar_t 字符

c++ - 如何在 OSX Mavericks 中为 Xcode 5.0.2 安装命令行工具?

c - 检测文件是否包含整数以外的字符

c++ - 使用哪种(自动)指针?