什么是不透明指针?
顾名思义,不透明是我们看不到的。例如,木材是不透明的。不透明指针是指向数据结构的指针,该数据结构的内容在定义之时不公开。
跟随指针是不透明的。通过查看定义,无法知道STest结构中包含的数据。
struct STest* pSTest;
将NULL分配给不透明的指针是安全的。
pSTest = NULL;
为什么不透明的指针?
在某些地方,我们只想提示编译器“嘿!这是我们的客户将使用的某些数据结构。不用担心,客户将在准备编译单元时提供其实现”。当我们处理共享代码时,这种类型的设计是健壮的。请参见以下示例:
假设我们正在开发一个用于处理图像的应用程序。由于我们生活在一个万事俱备的世界中,而且购买设备的价格非常便宜,因此我们希望开发适用于Windows,Android和Apple平台的应用程序。因此,根据我们的要求,有一个健壮,可扩展和灵活的好的设计将是很好的。我们可以拥有所有平台都可以使用的共享代码,然后不同的端点可以拥有平台特定的代码。
为了处理图像,我们有一个CImage类,该API公开了API以处理各种图像操作(缩放,旋转,移动,保存等)。
由于所有平台都将提供相同的操作,因此我们将在头文件中定义此类。但是,跨平台处理图像的方式可能有所不同。就像Apple可以使用与Windows不同的机制来访问图像的像素。这意味着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:特定于Apple的代码将驻留在此处
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,并将所有特定于平台的代码放在此处。
问题?让他们继续来。我们很乐意回答。