Рубрики

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

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

Следующий указатель непрозрачен. Невозможно узнать данные, содержащиеся в структуре STest, взглянув на определение.

struct STest* pSTest;

Безопасно назначать NULL непрозрачному указателю.

pSTest = NULL; 

Почему непрозрачный указатель?
Есть места, где мы просто хотим дать указание компилятору: «Эй! Это некоторая структура данных, которая будет использоваться нашими клиентами. Не волнуйтесь, клиенты обеспечат его реализацию при подготовке модуля компиляции ». Такой тип дизайна является надежным, когда мы имеем дело с общим кодом. Пожалуйста, смотрите ниже пример:

Допустим, мы работаем над приложением для работы с изображениями. Поскольку мы живем в мире, где все движется к облаку, а устройства очень доступны для покупки, мы хотим разрабатывать приложения для платформ Windows, Android и Apple. Поэтому было бы неплохо иметь хороший дизайн, который будет надежным, масштабируемым и гибким в соответствии с нашими требованиями. У нас может быть общий код, который будет использоваться всеми платформами, и тогда разные конечные точки могут иметь специфичный для платформы код.
Для работы с изображениями у нас есть класс CImage, который предоставляет API для работы с различными операциями с изображениями (масштабирование, поворот, перемещение, сохранение и т. Д.).
Поскольку все платформы будут предоставлять одинаковые операции, мы определим этот класс в заголовочном файле. Но способ обработки изображения может отличаться для разных платформ. Как Apple может иметь другой механизм доступа к пикселям изображения, чем Windows. Это означает, что API могут требовать различного набора информации для выполнения операций. Итак, для работы с общим кодом мы хотели бы сделать следующее:

Image.h: файл заголовка для хранения объявления класса.

// Этот класс предоставляет API для работы с различными
// операции с изображениями. Разные платформы могут
// реализовать эти операции по-разному.

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: код, который будет доступен для разных конечных точек

// Конструктор и деструктор для CImage
CImage::CImage()
{

    InitImageInfo();

}

  
CImage::~CImage()
{

    // Уничтожить вещи здесь

}

Image_windows.cpp: специфичный для Windows код будет находиться здесь

struct SImageInfo

{

   // Специфичный для Windows DataSet

};

  

void CImage::InitImageInfo()

{

    pImageInfo = new SImageInfo;

    // Инициализируем специфичную для Windows информацию здесь

}

  

void CImage::Rotate()

{

    // Используем окна, специфичные для SImageInfo

}

Image_apple.cpp: код, специфичный для Apple, будет находиться здесь

struct SImageInfo

{

    // Специфичный для Apple DataSet

};

void CImage::InitImageInfo()

{

    pImageInfo = new SImageInfo;

      

    // Инициализация специфической информации о яблоке

}

void CImage::Rotate()

{

    // Используем специфичный для яблока SImageInfo

}

Как видно из приведенного выше примера, при определении чертежа класса CImage мы только упоминаем, что существует структура данных SImageInfo.
Содержание SImageInfo неизвестно. Теперь клиенты (windows, apple, android) обязаны определить эту структуру данных и использовать ее в соответствии со своими требованиями
. Если в будущем мы хотим разработать приложение для новой конечной точки «X», дизайн уже существует. Нам нужно только определить SImageInfo для конечной точки 'X' и использовать его соответствующим образом.

Обратите внимание, что приведенный выше пример является одним из способов сделать это. Дизайн — все о обсуждении и требовании. Хороший дизайн решается с учетом многих факторов. Мы также можем иметь платформо-зависимые классы, такие как CImageWindows, CImageApple и поместить туда весь платформо-зависимый код.

Вопросов? Держите их в пути. Мы хотели бы ответить.

Эта статья предоставлена Aashish Barnwal . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме

Рекомендуемые посты:

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

0.00 (0%) 0 votes