C ++语法问题

时间:2009-04-13 23:22:07

标签: c++ typedef static-cast

以下语法是什么意思?

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

5 个答案:

答案 0 :(得分:2)

static_cast意味着系统实际上并没有尝试确保当您从一个引用类型转换为另一个引用类型时,您要转换的内容实际上是目标类型的实例(与动态转换不同)。

因此,您告诉编译器您足够聪明,知道hMyClass中包含的地址以及来自某些内容的地址实际上包含MyClass的实例,并且您将对将要发生的不可预测的事情承担全部责任。如果你错了就会发生。

你的“某事”是什么类型的?你也可能有错误。你可能想要一个&amp; something。

答案 1 :(得分:1)

这实际上无效。您要为类型分配值,而不是第2行的变量。

答案 2 :(得分:0)

void *通常用于通用指针。

在C#中,它类似于:

object o = new XmlDocument();

object o = new List();

但是,在C ++中,实施的类型安全性很少。 IIRC,static_cast与(强制转换)相同,因为没有进行运行时类型检查。

答案 3 :(得分:0)

基本上,有人在一个void指针中存储了一个MyClass指针,可能会将其传递给回调。这个代码可能被称为回调,它将它反馈回来,将其用作MyClass。

此外,它有语法错误,正如eagerwishes所说。

答案 4 :(得分: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 *”参数来实现此目的。这是指向某个内存位置的原始指针。任何东西都可能在那个位置,一个整数,一个类实例,一个字符串等。第三方库保留在该指针上并在某个时刻将其返回给你的代码。

示例代码的第3行是使用void *指针并将其转换为对类实例的引用。 C ++引用就像指针一样,除了它们不能为NULL并且它们使用值语法(例如,使用'。'运算符而不是' - &gt;'运算符。)然后,示例代码的第4行使用了一个方法。构造的类实例。

无论如何,如果所有4行代码在您正在处理的代码库中是连续的,那么该代码意味着某人对C ++一无所知。这是在一行中执行相同代码的更紧凑的方法:

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

或者,如果您更喜欢值语法:

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

祝你好运!