C++ 不透明指针

C++ 不透明指针

什么是不透明指针

不透明,顾名思义,是我们无法穿透的。比如木材是不透明的。不透明指针是指指向一个在定义时其内容未知的数据结构的指针。

在这之后的指针是不透明的。定义并没有揭示STest结构中包含的数据。

struct STest* pSTest;

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

pSTest = NULL; 

为什么要使用不透明指针

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

假设我们正在开发一个图像处理应用程序。由于我们生活在一个一切都转向云端且设备非常实惠的世界中,我们希望为Windows、Android和Apple平台开发应用程序。因此,拥有一个既强大、可扩展又灵活的设计来满足我们的需求是很好的。我们可以拥有所有平台都使用的共享代码,然后不同的终端可以拥有特定于平台的代码。

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

因为所有平台都将提供相同的操作,我们会在头文件中定义这个类。然而,处理图像的方式可能在各个平台之间有所不同。示例,苹果可能使用不同的机制来访问图像像素,而不同平台可能需要不同的信息来执行操作。所以,为了共享代码,我们希望做到以下几点:

Image.h : 存储类声明的头文件。

// This class provides API to deal with various
// image operations. Different platforms can
// implement these operations in different ways.
class CImage
{
public:
    CImage();
    ~CImage();
    struct SImageInfo* pImageInfo;
    void Rotate(double angle);
    void Scale(double scaleFactorX,
            double scaleFactorY);
    void Move(int toX, int toY);    
private:
    void InitImageInfo();
};

Image.cpp : 在不同终端之间共享的代码。 .

// Constructor and destructor for CImage
CImage::CImage()
{
    InitImageInfo();
}

CImage::~CImage()
{
    // Destroy stuffs here
}

Image_windows.cpp : Windows专用的代码将会在此处。

struct SImageInfo
{
// Windows specific DataSet
};

void CImage::InitImageInfo()
{
    pImageInfo = new SImageInfo;
    // Initialize windows specific info here
}

void CImage::Rotate()
{
    // Make use of windows specific SImageInfo
}

Image_apple.cpp: 代码与苹果相关的内容将在这里存放。

struct SImageInfo
{
    // Apple specific DataSet
};
void CImage::InitImageInfo()
{
    pImageInfo = new SImageInfo;

    // Initialize apple specific info here
}
void CImage::Rotate()
{
    // Make use of apple specific SImageInfo
}

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

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

请记住,上面提供的示例只是一种方法。设计是关于辩论和要求的。在创建良好的设计时考虑了许多因素。我们还可以有特定于平台的类,示例CImageWindows和CImageApple,在这些类中我们可以放置所有特定于平台的代码。

结论

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

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

如果语言是强类型的,则对于没有其他对不透明指针类型T的了解的程序和过程仍然可以声明该类型的变量、数组和记录字段,分配该类型的值,并比较这些值是否相等。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程