Оглавление:

Как создать шаблон проектирования Singleton в C ++: 9 шагов
Как создать шаблон проектирования Singleton в C ++: 9 шагов

Видео: Как создать шаблон проектирования Singleton в C ++: 9 шагов

Видео: Как создать шаблон проектирования Singleton в C ++: 9 шагов
Видео: Шаблон проектирования "Одиночка" (Swift 4, Xcode 9) 2024, Июнь
Anonim
Как создать шаблон проектирования Singleton в C ++
Как создать шаблон проектирования Singleton в C ++

Вступление:

Цель этого руководства - научить пользователя, как реализовать шаблон проектирования singleton в их программе на C ++. При этом этот набор инструкций также объяснит читателю, почему элементы синглтона такие, какие они есть, и как обрабатывается код. Знание этого поможет в будущем при отладке ваших будущих синглтонов. Что такое шаблон проектирования singleton? Шаблон проектирования singleton - это шаблон проектирования, в котором кодировщик создает класс, экземпляр которого может быть создан только один раз, а к общедоступным функциям классов можно получить доступ где угодно, при условии, что вы # включили файл заголовка в другие файлы, связанные с проектом.

Шаблон проектирования singleton - это шаблон проектирования, который необходимо знать любому объектно-ориентированному программисту, программистам и программистам игр. Шаблон проектирования singleton также является одним из самых простых шаблонов проектирования кодирования. Изучение этого может помочь вам изучить другие, более сложные шаблоны проектирования в будущем. Это также может помочь вам оптимизировать код вашей программы так, как вы не думали, что это возможно.

В то время как сложность одноэлементного шаблона проектирования легка по сравнению с другими шаблонами проектирования, этот набор инструкций имеет среднюю сложность. Это означает, что для выполнения этих инструкций мы рекомендуем вам знать основные и продвинутые синтаксические требования C ++. Вы также должны знать правила кодирования C ++ (т.е. сохранять частные переменные класса, по одному классу на файл заголовка и т. Д.). Вы также должны знать, как освободить память и как конструкторы и деструкторы работают в C ++.

Это учебное пособие займет в среднем около 10-15 минут.

Требования к материалам:

-Компьютер (может быть ПК или Mac), на котором может работать Visual Studios (любая версия)

-Простая программа, созданная в Visual Studios, с помощью которой вы можете протестировать свой синглтон.

Примечание. Шаблон проектирования singleton может быть реализован в любой другой среде IDE или интерфейсе программирования, поддерживающей C ++, но для этого набора инструкций мы будем использовать Visual Studios Enterprise Edition.

Шаг 1. Создайте свой класс с файлом заголовка и файлом CPP

Создайте свой класс с файлом заголовка и файлом CPP
Создайте свой класс с файлом заголовка и файлом CPP
Создайте свой класс с файлом заголовка и файлом CPP
Создайте свой класс с файлом заголовка и файлом CPP

Чтобы создать эти два файла и класс одновременно, откройте свой проект / программу в Visual Studios, перейдите в проводник решений, щелкните правой кнопкой мыши, и рядом с курсором мыши должно появиться поле, найдите параметр «Добавить», наведите указатель мыши на над ним, и справа должен появиться еще один прямоугольник. В этом поле вы хотите найти параметр «Новый элемент..», щелкните его, и должно появиться окно, напоминающее изображение на фотографии 1.1 ниже. В этом окне вы хотите выбрать «Класс C ++», а затем нажать «Добавить». Это откроет еще одно окно, похожее на изображение на фото 1.2. В этом окне вы вводите имя своего класса в поле «Имя класса», и Visual Studios автоматически назовет фактический файл после имени класса. Для целей этой инструкции мы назовем наш класс «EngineDebugSingleton», но это может быть любое буквенное имя. Теперь вы можете нажать «ОК» и перейти к шагу 2.

Примечание. Обозреватель решений и место хранения файлов на вашем компьютере отделены друг от друга. Перемещение или создание чего-либо в проводнике решений не приведет к перемещению или упорядочиванию файлов в проводнике файлов ОС. Безопасный способ организовать ваши файлы на стороне проводника файлов - удалить, но не удалять определенные файлы из проводника решений, переместить те же файлы в проводнике файлов в желаемое место, а затем вернуться в проводник решений, щелкнуть правой кнопкой мыши, найдите опцию «Добавить», затем найдите «Существующий элемент» и найдите файлы, которые вы переместили. Убедитесь, что вы переместили и заголовок, и файл cpp.

Шаг 2. Установите конструктор в частный

Установите конструктор в частный
Установите конструктор в частный

Если при создании нового файла CPP и файла заголовка он не открылся автоматически, перейдите в проводник решений, щелкните и откройте «EngineDebugSingleton.h». Затем вас встретят «EngineDebugSingleton ()», конструктор класса по умолчанию, и «~ EngineDebugSingleton ()» - деструктор класса. На этом шаге мы захотим установить конструктор в частный, это означает, что эта функция доступна только для класса и больше ничего. Благодаря этому вы не сможете создать переменную или выделить класс в память вне класса, только в файле заголовка классов и других функциях классов. Закрытый конструктор является ключом к паттерну проектирования и принципам работы синглтонов. В следующих шагах мы узнаем, как создается экземпляр синглтона и к нему осуществляется доступ.

Теперь класс должен выглядеть так после перемещения конструктора в закрытый (см. Связанную фотографию)

Шаг 3. Установите деструктор в частный

Установите деструктор в частный
Установите деструктор в частный

Как мы сделали с конструктором в

Шаг 2, для этого шага мы установим деструктор в частный. Как и в случае с конструктором, ничто, кроме самого класса, не сможет удалить любые переменные класса из памяти.

После завершения этого шага класс должен выглядеть следующим образом. (См. Сопутствующее фото)

Шаг 4: Создание переменной статического указателя в синглтоне

Создание переменной статического указателя в синглтоне
Создание переменной статического указателя в синглтоне

На этом этапе мы создадим

статическая переменная-указатель типа EngineDebugSingleton *. Это будет переменная, которая будет использоваться для выделения нашего синглтона в память и будет указывать на него все время, пока наш синглтон выделяется в память.

Вот как должен выглядеть наш заголовочный файл после создания этой переменной

Шаг 5: Создание экземпляра функции

Создание экземпляра функции
Создание экземпляра функции

Теперь мы хотим создать экземпляр

функция. Функция должна быть статической, и ей нужно будет вернуть ссылку на наш класс («EngineDebugSingleton &»). Мы назвали нашу функцию Instance (). В самой функции нам нужно сначала проверить, если ptrInstance == nullptr (можно сократить до! PtrInstance), если это nullptr, это означает, что синглтон не был выделен и в области действия оператора if мы будем хотите выделить, выполнив ptrInstance = new EngineDebugSingleton (). Здесь вы фактически размещаете синглтон в памяти. После выхода из области действия оператора if мы вернем то, на что указывает ptrInstance, что обозначается синтаксисом «* ptrInstance». Мы будем интенсивно использовать эту функцию при создании наших статических общедоступных функций, чтобы мы могли проверить, был ли синглтон создан и выделен в память. По сути, эта функция позволяет вам иметь только одно выделение класса и не более.

Вот как должен выглядеть наш класс после создания функции Instance (). Как видите, все, что мы сделали, осталось в закрытом разделе класса, это немного изменится в следующих нескольких шагах.

Шаг 6: Создание статических общедоступных функций

Создание статических публичных функций
Создание статических публичных функций
Создание статических публичных функций
Создание статических публичных функций
Создание статических общедоступных функций
Создание статических общедоступных функций

После того, как вы сделали функцию из

Шаг 5, вы можете начать делать статические общедоступные функции. У каждой публичной функции должна быть частная функция, имя этой функции не может быть таким же. Зачем делать функцию статической? Мы делаем общедоступные функции статическими, чтобы к ним можно было обращаться без реального объекта. Поэтому вместо того, чтобы делать что-то вроде «EngineDebugSingleObj-> SomeFunction ()», мы выполняем «EngineDebugSingleton:: Some Function ()». Это делает возможным доступ к синглтону практически в любом месте кода при условии, что вы # включили файл заголовка в конкретный файл проекта, с которым вы работаете. При этом вы также можете создать синглтон с помощью любой из его общедоступных функций.

Для наших целей на этом этапе мы создали две общедоступные статические функции void, «add ()» и «subtract ()». В частном разделе у нас есть еще две функции: «PrivAdd ()» и «PrivSubtract ()». Мы также добавили переменную типа int под названием «NumberOfThings». Определение этих функций войдет в файл CPP наших классов. Чтобы легко заставить функцию попасть в файл CPP, вы выделяете курсором функцию, под которой должна быть зеленая линия, и нажимаете «Left ALT + ENTER», это даст вам возможность создать определение в связанный файл CPP классов. См. Фото 6.1, чтобы увидеть, как должен выглядеть файл заголовка, и после того, как вы создали все определения функций, ваш CPP должен выглядеть как фотография 6.2, за исключением того, что ваши определения функций не будут содержать кода.

Теперь вы захотите добавить тот же код, что и на фото 6.2, в определения ваших функций. Как было сказано ранее, наши общедоступные функции будут использовать функцию Instance (), которая будет возвращать то, на что указывает ptrInstance. Это позволяет нам получить доступ к частным функциям нашего класса. С любой общедоступной функцией синглтона вы должны вызывать только эту функцию экземпляра. Единственное исключение - наша функция Terminate.

Примечание. Точные общедоступные и частные функции, показанные на этом шаге, не являются необходимыми, у вас могут быть разные имена функций и операции в частной функции, но для любого типа общедоступной функции у вас должна быть частная функция, которая будет дополнять ее и публичная функция всегда должна использовать, в нашем случае, функцию Instance ().

Шаг 7: Создание функции завершения

Создание функции завершения
Создание функции завершения
Создание функции завершения
Создание функции завершения

Поскольку мы можем только освободить наш синглтон из памяти в нашем классе, мы должны создать статическую общедоступную функцию. Эта функция вызовет delete для ptrInstance, который вызывает деструктор класса, а затем мы захотим вернуть ptrInstance в значение nullptr, чтобы его можно было выделить снова, если ваша программа не завершится. Вы также захотите завершить свои синглтоны, чтобы очистить всю выделенную память, которую вы выделили в частных переменных любого синглтона.

Шаг 8: установка для PtrInstance значения Nullptr

Установка для PtrInstance значения Nullptr
Установка для PtrInstance значения Nullptr

Чтобы завершить синглтон, перейдите к файлу EngineDebugSingleton. CPP и в верхней части файла CPP, в нашем случае, введите «EngineDebugSingleton * EngineDebugSingleton:: ptrInstance = nullptr».

Это изначально установит для ptrInstance значение nullptr, поэтому, когда вы впервые выполняете функцию экземпляра в первый раз, нашему классу будет разрешено выделить в память. Без него вы, скорее всего, получите ошибку, потому что будете пытаться получить доступ к памяти, для которой ничего не выделено.

Шаг 9: проверка и заключение

Тест и заключение
Тест и заключение

Теперь мы хотим протестировать наш синглтон, чтобы убедиться, что он работает, это потребует от нас вызова общедоступных функций, как описано в шаге 6, и мы рекомендуем вам настроить точки останова, чтобы пройти через ваш код и убедиться, что синглтон работает как должен быть. Нашей отправной точкой будет main.cpp нашего проекта, а наш main.cpp теперь выглядит как на изображении ниже.

Поздравляю! Вы только что завершили свою первую реализацию шаблона проектирования Singleton. С помощью этого шаблона проектирования вы можете оптимизировать код различными способами. Например, теперь вы можете создавать системы управления, которые работают во время выполнения вашей программы, и к которым можно получить доступ через статические функции в любом месте, где вы включили класс.

Ваш окончательный заголовочный файл должен выглядеть как на фото 7.1. CPP-файл, связанный с вашим синглтоном, должен выглядеть как фотография 6.2 с добавлением в верхней части файла кода, показанного на шаге 8. Эта инструкция предоставила вам простую структуру шаблона проектирования синглтона.

Совет по поиску и устранению неисправностей:

Возникли ошибки, связанные с памятью?

Обязательно обратитесь к шагам 7 и 8, чтобы убедиться, что вы устанавливаете ptrInstance на nullptr.

Возникает бесконечный цикл?

Убедитесь, что для общедоступных функций в их определениях вы вызываете частную функцию, а не ту же общедоступную функцию.

Объекты, размещенные в синглтоне, вызывают утечку памяти?

Убедитесь, что вы вызываете функцию завершения синглтона, когда это необходимо в программном коде, а в деструкторе синглтона убедитесь, что вы освободили все объекты, которые были выделены в память в рамках кода синглтона.