Непрозрачный указатель
Что такое непрозрачный указатель?
Непрозрачность, как следует из названия, мы не можем увидеть. например, древесина непрозрачна. Непрозрачный указатель - это указатель, который указывает на структуру данных, содержимое которой не отображается во время ее определения.
Следующий указатель непрозрачен. Невозможно узнать данные, содержащиеся в структуре STest, глядя на определение.
struct STest * pSTest;
Непрозрачному указателю безопасно присвоить NULL.
pSTest = NULL;
Почему непрозрачный указатель?
Есть места, где мы просто хотим намекнуть компилятору: «Эй! Это некоторая структура данных, которая будет использоваться нашими клиентами. Не волнуйтесь, заказчики предоставят его реализацию при подготовке модуля компиляции ». Такой тип дизайна надежен, когда мы имеем дело с общим кодом. См. Пример ниже:
Допустим, мы работаем над приложением для работы с изображениями. Поскольку мы живем в мире, где все перемещается в облако, а устройства очень доступны для покупки, мы хотим разрабатывать приложения для платформ Windows, Android и Apple. Итак, было бы неплохо иметь хороший дизайн, который был бы надежным, масштабируемым и гибким в соответствии с нашими требованиями. У нас может быть общий код, который будет использоваться всеми платформами, а затем разные конечные точки могут иметь код, специфичный для платформы.
Для работы с изображениями у нас есть класс CImage, предоставляющий 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», дизайн уже есть. Нам нужно только определить SImageInfo для конечной точки «X» и использовать его соответственно.
Обратите внимание, что приведенный выше пример является одним из способов сделать это. Дизайн - это все о дискуссиях и требованиях. Хороший дизайн выбирается с учетом многих факторов. У нас также могут быть классы, специфичные для платформы, такие как CImageWindows, CImageApple, и помещать туда весь код, специфичный для платформы.
Вопросов? Держите их. Мы с удовольствием ответим.
Эта статья предоставлена Aashish Barnwal. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.