Непрозрачный указатель

Опубликовано: 1 Января, 2022

Что такое непрозрачный указатель?
Непрозрачность, как следует из названия, мы не можем увидеть. например, древесина непрозрачна. Непрозрачный указатель - это указатель, который указывает на структуру данных, содержимое которой не отображается во время ее определения.

Следующий указатель непрозрачен. Невозможно узнать данные, содержащиеся в структуре 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. Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .
C++ C