2009-04-13 91 views
0

下面的语法是什么意思?C++语法问题

typedef void* hMyClass; //typedef as a handle or reference 
hMyClass f = &something; 
const MyClass& foo = static_cast<MyClass&>(*f); 
foo.bar(); 

回答

2

一个的static_cast意味着该系统实际上并没有试图确保,当你从一个引用类型转换为另一种,要转换的东西实际上是目标类型的实例(不同于动态管型) 。

因此,您告诉编译器您足够聪明,知道hMyClass中包含的地址以及来自某个东西的地址实际上包含MyClass的一个实例,并且您对不可预测的事情负有全部责任如果你错了会发生。

你的“东西”是什么类型?你也可能有一个错误。你可能想要一个&的东西。

1

这实际上是无效的。你正在给一个类型赋值,而不是第2行的变量。

0

void *通常用于泛型指针。

在C#这将是类似这样的:

object o = new XmlDocument(); 

对象o =新列表();

但是,在C++中,执行的类型安全性很小。 IIRC,static_cast与(cast)相同,因为没有运行时类型检查。

+0

通常模板用于泛型集合;现在有几个地方你实际上需要空指针。空指针通常用于“匿名”类型,如句柄。通常,基于模板的解决方案在适用时是优选的。 – 2009-04-13 23:38:59

0

本质上,有人已经将一个MyClass指针存储在一个void指针中,可能将其传递给回调函数。这段代码大概是被回调过来的,正在将它重新用作MyClass。

此外,它还有语法错误,正如eagerwishes所指出的那样。

0

很难说没有更多的上下文,这个“意味着什么”。我认为你正在处理别人的代码,并且你显示的线条分散在多个函数中。

对于代码意图,我最好的猜测是这是一个处理第三方代码/库的机制。在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 *”参数来实现此目的。这是一些内存位置的原始指针。任何东西都可以在这个位置,一个整数,一个类实例,一个字符串等等。第三方库保存在那个指针上,并在某个时候返回给你的代码。

您的示例代码的第三行是将void *指针并将其转换为对类实例的引用。 C++引用就像指针,除非它们不能为NULL,并且它们使用值语法(使用'。'运算符而不是' - >'运算符)。示例代码的第4行然后在重构的类实例上使用一个方法。无论如何,如果代码库中的所有4行代码都是连续的,那么代码意味着某人对C++一无所知。这里有一个更紧凑的方式做同样的代码在同一行:

((const MyClass*)something)->Foo(); 

或者,如果你喜欢的值语法:

(*((const MyClass*)something)).Foo(); 

祝您好运!