📜  不透明指针

📅  最后修改于: 2021-05-30 02:11:52             🧑  作者: Mango

什么是不透明指针?
顾名思义,不透明是我们看不到的。例如,木材是不透明的。不透明指针是指向数据结构的指针,该数据结构的内容在定义之时不公开。

跟随指针是不透明的。通过查看定义,无法知道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,并将所有特定于平台的代码放在此处。

问题?让他们继续来。我们很乐意回答。

要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”