指向函数的对象指针
Object Pointer to a function
我读了一段标题代码,我发现下面:
ObjPtr.h:
#include <dlfcn.h>
#define OBJPTR(X) void* X##Ptr ;
void* (*X##ObjPtr)() ;
void * CreateObj(void * handler, char* LibName, char* FunctionName);
交易.c
//...
OBJPTR(DB);
//...
DBObjPtr = CreateObj(DBPtr, "DBTransaction", "Function1");
if ((unsigned long)(DBObjPtr)(csPara1, csPara2) != PD_FOUND)
{
//...
首先,我不明白它在头文件中的定义行中是什么意思。(为什么定义行中有 X##?什么意思?
其次,在c文件中创建对象而不是直接调用函数。我认为这种设计的目的是为了隔离对象,以便于维护和解决方案构建/交付;或来自不同开发人员的代码加密,如果我是对的。但除此之外呢?或者这种设计模式是什么样的?
##
是预处理器的(!(串联。在给定的情况下,使用宏会创建两个变量:
OBJPTR(DB);
将解决:
void* DBPtr;
void* (*DBObjPtr)();
实际上,我们在这里找到的不是有效的C++(这就是您标记的问题(:
void* (*DBObjPtr)()
声明一个不接受任何参数的函数指针,但稍后使用其中两个参数调用它。- 声明的函数返回指向 void 的指针,但它是在不向函数指针赋值的情况下分配的。
此代码仅在 C 中有效(void* (*DBObjPtr)()
声明一个函数指针,参数列表未定义;no-argument-function 需要显式void
作为参数:void* (*x)(void)
!(,C 允许从指针隐式转换为 void 到其他指针类型。
意图可能在 C 中提供了某种多态性:
DBObjPtr = CreateObj
(
// probably used as some kind of handle; as not being passed
// as pointer to pointer, the function cannot re-assign, but
// only use it; so I assume that is has been initialized at
// some point before this function call...
DBPtr,
// some kind of identifier from where to load a function from for
// later use; as the parameter is called "library", it might load
// the address of a function within a SO (*nix) or DLL (windows)
"DBTransaction",
// the name of the function to load
"Function1"
);
在C++中,您可能会以不同的方式处理它:
class Loader;
Loader* db = createLoader(); // initialization lacking in your sample code;
// alternatively (and probably better!) via constructor
void* (*fptr)(int, int) = db->createObj("L", "F");
这还行不通,我们需要应用一些更改。首先,我们需要更改函数的返回类型,它必须返回一个接受任意参数的函数指针。您可以让它返回任意参数(通过省略号(或只有一个空参数列表 - 没关系,无论如何您都必须转换结果(除非使用第二个变体并且加载的函数真的不接受任何参数......但是从 C++11 开始,有一种更优雅的方式来做这些事情,该函数可以作为可变参数模板函数实现:
class Loader
{
public:
template <typename ... TT>
auto createObj(char const*, char const*) -> void*(*)(TT ...);
};
然后,强制转换将隐藏在函数中,您可以简单地将其用作:
auto f = loader->createObj<int, int>("L", "F");
// ^ yeah, let's profit from C++11 again...
只是为了如果你好奇: C++11 之前的方式:
class Loader
{
public:
void* (*createObj())(...);
// function returning function pointer - ugly syntax, I know
// (a typedef for the function pointer makes reading a little easier...)
};
void*(*f)(int, int) = reinterpret_cast<void*(*)(int, int)>(create());
原始宏的最后一点说明:我个人不会使用它,即使在 C 中也不会!对于懒惰的人来说,它可能看起来不错,但实际上只是混淆了变量的声明,并且还产生了较少的类型安全函数指针。所以我会自己声明变量:
void* db /*= ...*/ ;
void* (*f)(int, int) = createObj(db, "L", "F");
// ^ ^ already with correct parameter list
- 对象指针在c++中是如何工作的
- C++ 对象指针数组的复制构造函数
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 正确初始化和销毁对象指针的C++数组?
- 如何深度复制链表对象指针
- 对象指针 c++ 的全局向量错误
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 静态对象指针
- 正在将对象指针数组初始化为NULL
- 如何使用条件表达式返回对象指针?
- std::flush可以用于将对象指针转换为其封闭数组指针吗
- 使用C对象指针构建PyObject*
- 如何在使用对象指针时访问成员函数
- 静态强制转换允许转换对象指针,但不允许转换整数
- C++ abort() 在函数内的抽象类对象指针调用上
- 指向函数的对象指针
- 访问指向对象指针向量的指针的第一个元素?
- 如何将对象/指针正确存储到 Qlist 中
- 对象指针打印结果以相反的顺序进行