По отношению к этой теме: Что такое идиома копирования и обмена?
В нем говорится, что один класс должен обрабатывать не более одного ресурса. Что подразумевается под ресурсом?
РЕДАКТИРОВАТЬ: Например, у меня есть класс, который обрабатывает информацию для каждого монитора и содержит массив пикселей рабочего стола. Будет ли массив и только массив считаться ресурсом? Будет ли массив мониторов, которые содержат информацию о мониторе, и массив пикселей рабочего стола другим ресурсом, для которого потребуется другой класс? Это в другом классе, но так ли это?
Я искал здесь и в Google, но нашел только больше информации, касающейся правила трех или файлов ресурсов (* .rc и MSDN). Ничего, что относится к определению.
Этот вопрос относится к понятиям в C ++ в целом. В этом случае он также использует общую концепцию «ресурса»: объект, обычно внешний, предоставляемый внешним источником, который использует блок кода. Это то же самое, что и «ресурс» в реальной жизни.
В случае копирования и замены это относится к тому, что представляет ваш класс C ++. Идея проста: каждый экземпляр вашего класса C ++ будет предоставлять доступ к данному ресурсу. Например, давайте возьмем файл на диске. Ресурс — это файл; операционная система предоставляет доступ к этому файлу. Ваш класс C ++ будет оборачиваться вызовами API операционной системы для чтения и записи в этот файл.
Вы задали вопрос о том, как смешивать эти классы с правилами инициализации C ++. То, как вы следуете этим правилам, будет зависеть от того, что позволяет использовать внешний доступ и что вам нужно делать лично.
Конечно, ваша программа также может иметь свои собственные ресурсы. Например, глобальный массив, который отображает один тип перечисления на другой тип перечисления, может быть ресурсом вашей программы. Таким образом, ответ на ваш вопрос «каким должен быть ресурс в моей программе» — «это действительно зависит от того, как вы написали свою программу».
Программы Windows также имеют свои собственные «ресурсы», такие как растровые изображения, значки, макеты элементов управления диалогового окна, макеты меню, локализованные строки и другие элементы. Чтобы эти вещи могли быть встроены в выходной двоичный файл, Windows предоставляет свою собственную систему, а также вызывает все эти «ресурсы». Файл .rc — это просто список всех этих ресурсов Windows; Вы встраиваете это в свою программу Windows.
GLib (на котором построен GTK +), Qt и различные API Apple имеют свои аналогичные системы, каждая из которых также имеет «ресурс» в своих именах.
(Вы можете написать классы C ++, которые также предоставляют доступ ко всем этим конкретным ресурсам; в этом случае ресурс является ресурс.)
Но при чтении очень важно не путать общий термин («ресурс») для конкретной технологии (ресурсы Windows) и наоборот, особенно для такого абстрактного понятия, как ресурс. Имейте это в виду, продолжая свое программирование.
Ресурсы, такие вещи как: raw pointers
которые должны быть удалены (вот почему у нас есть умные указатели, такие как std::unique_ptr
, std::shared_ptr
), файлы, которые должны быть правильно закрыты (вот почему мы имеем std::fstream
), std::thread
(для управления необработанными дескрипторами, которыми вы могли бы управлять в других операционных системах). std::reference_wrapper
управляет ссылками … и так далее. Как вы могли заметить, все они управляют одним ресурсом, не более.
Идея в том, что вы не хотите ни одного unique_ptr
управлять 2 указателями для вас. Вы бы создали два unique_ptr
классы для каждого необработанного указателя.
Для вашего конкретного вопроса, который вы отредактировали, в общем, вы хотите сделать следующее:
создать класс MonitorsManager
который управляет всеми мониторами (это его задача)
создать класс MonitorInfo
(который управляет информацией одного монитора и пикселей
Вы заметите, что все станет проще, если у вас будет хороший дизайн, потому что в будущем вы захотите легко редактировать и обновлять эти классы, и если вы все смешаете, это будет действительно сложно, поверьте мне.
Кроме того, ваш MonitorInfo
класс не должен иметь никакой зависимости от MonitorsManager
потому что, если люди должны включить класс «MonitorsManager» в свой проект, чтобы использовать ваш «MonitorInfo
«класс, значит, вы провалились. Не у всех есть несколько мониторов, у некоторых может быть один.