以下语法是什么意思?
typedef void* hMyClass; //typedef as a handle or reference
hMyClass f = &something;
const MyClass& foo = static_cast<MyClass&>(*f);
foo.bar();
以下语法是什么意思?
typedef void* hMyClass; //typedef as a handle or reference
hMyClass f = &something;
const MyClass& foo = static_cast<MyClass&>(*f);
foo.bar();
static_cast 意味着系统实际上并没有尝试确保当您从一种引用类型转换为另一种时,您要转换的东西实际上是目标类型的一个实例(与动态转换不同)。
因此,您告诉编译器您足够聪明,知道 hMyClass 中包含的地址实际上包含 MyClass 的一个实例,并且您对如果您将发生的不可预测的事情承担全部责任错了。
你的“东西”是什么类型的?那里也可能有错误。你可能想要一个 &something。
这实际上是无效的。您正在为类型分配一个值,而不是第 2 行的变量。
void* 通常用于泛型指针。
在 C# 中,它类似于:
object o = new XmlDocument();
对象 o = 新列表();
然而,在 C++ 中,几乎没有强制执行类型安全。IIRC,static_cast 与 (cast) 相同,因为不进行运行时类型检查。
本质上,有人将 MyClass 指针存储在 void 指针中,可能会将其传递给回调。该代码可能已被回调,正在将其转换为 MyClass。
此外,它也有语法错误,如 eagerwishes 所述。
如果没有更多的上下文,很难准确地说出这个“意味着”什么。我假设您正在处理其他人的代码,并且您显示的行似乎分散在许多函数中。
我对代码意图的最佳猜测是,这是一种处理第三方代码/库的机制。在 C++ 中,使用(非模板化)具有您自己类型的第三方库是很常见的。如果这些库需要临时保存您创建和拥有的数据,您需要一种方法让库访问您的数据,即使库不知道您的类型。一个例子是回调/事件功能。如果一个库会在事件发生时异步通知您,您需要给它一个函数指针以及用户定义的数据,以便在调用该函数时,您知道如何处理它。库通常为此用户提供的数据使用 void* 指针。在 C++ 中,通常只为用户提供的数据传入一个对象实例,然后委托给该对象来处理回调。这里'
// 3rd-party library API
typedef void (*PingNotifyPtr)(void*);
void NotifyOnPing(PingNotifyPtr, void* userData);
// User Code
void MyNotify(void* myData)
{
MyClass* ptr = (MyClass*)myData;
// do something with ptr
}
void Main()
{
MyClass *pClass = new MyClass();
NotifyOnPing(&MyNotify, pClass);
// the callback is now armed with all the data it needs.
}
许多库通过声明“void*”参数来实现这一点。这是指向某个内存位置的原始指针。任何东西都可能在那个位置,一个整数、一个类实例、一个字符串等。第 3 方库保存该指针并在某个时候将其返回给您的代码。
示例代码的第 3 行采用 void* 指针并将其转换为对类实例的引用。C++ 引用类似于指针,但它们不能为 NULL 并且它们使用值语法(例如,使用“.”运算符而不是“->”运算符。)示例代码的第 4 行然后使用重新定义的方法构成类实例。
无论如何,如果您正在处理的代码库中所有 4 行代码都是连续的,那么该代码意味着有人对 C++ 一无所知。这是在一行中执行相同代码的更紧凑的方法:
((const MyClass*)something)->Foo();
或者,如果您更喜欢值语法:
(*((const MyClass*)something)).Foo();
祝你好运!