不透明指针

2024 年 8 月 28 日 | 3 分钟阅读

不透明指针到底是什么?

顾名思义,不透明是指我们无法看穿的东西。例如,木头就是不透明的。不透明指针是指向一种数据结构,其内容在定义时未知。

该指针之后是不透明的。其定义不揭示 STest 结构中包含的数据。

将不透明指针设置为 NULL 是安全的。

为什么需要不透明指针?

有时我们只想告诉编译器:“嘿!这是一个我们的客户将使用的数据结构。别担心,客户将在准备编译单元时实现它。” 在处理共享代码时,这种设计非常健壮。请看以下示例:

假设我们正在开发一个图像处理应用程序。我们希望为 Windows、Android 和 Apple 平台开发应用程序,因为我们生活在一个一切都在向云端迁移、设备价格非常便宜的世界。因此,拥有一个健壮、可扩展且足够灵活以满足我们需求的好设计将是件好事。我们可以拥有所有平台使用的共享代码,然后不同的端点可以拥有平台特定的代码。

为了处理图像,我们有一个 CImage 类,它公开了各种图像操作(缩放、旋转、移动、保存等)的 API。

由于所有平台都将提供相同的操作,我们将在头文件中定义此类的声明。然而,图像的处理方式可能因平台而异。例如,Apple 可能使用与 Windows 不同的机制来访问图像像素。这意味着 API 可能需要不同的信息集来执行操作。因此,为了在共享代码上工作,我们希望这样做:

Image.h:一个用于存储类声明的头文件。

Image.cpp:将在不同端点之间共享的代码

Image_windows.cpp:Windows 特定代码将驻留在此处

Image_apple.cpp:Apple 特定代码将驻留在此处

如前例所示,我们在定义 CImage 类的蓝图时,只提到了 SImageInfo 数据结构的存在。

SImageInfo 的内容未知。现在,客户端(Windows、Apple 和 Android)有责任定义该数据结构并根据需要使用它。如果将来我们想为新的端点“X”创建应用程序,设计已经到位。我们只需要为端点“X”定义 SImageInfo 并使用它。

请记住,上面提供的示例只是一种方法。设计完全取决于争论和需求。在创建良好设计时会考虑许多因素。我们还可以拥有特定于平台的类,例如 CImageWindows 和 CImageApple,其中我们可以放置所有特定于平台的代码。

结论

不透明指针是不透明数据类型的一个子集,不透明数据类型是一种声明为指向某种未指定类型的记录或数据结构的指针的数据类型。

不透明指针可以在各种编程语言中找到,包括 Ada、C、C++、D 和 Modula-2。

如果语言是强类型的,那么对不透明指针类型 T 没有其他了解的程序和过程仍然可以声明该类型的变量、数组和记录字段,分配该类型的值,并比较这些值的相等性。但是,它们不能解引用这样的指针,并且只能通过调用包含缺失信息的程序来更改对象的内容。