Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159

Кто должен регистрировать класс в фабрике?

12.04.2016, 11:27. Показов 1662. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Наверняка вопрос простой, но раньше я над этим не задумывался. Сейчас у меня есть фабрика классов с методами Add и Create. И в своей программе я вызываю Add для нескольких классов. Но задумался, ведь чтобы добавить новый класс, нужно каждый раз не забыть добавить его в фабрику. Получается, что нужна функция класса, которая сама себя как бы регистрирует. Но нормально ли это, ведь класс не должен вроде бы ничего знать про окружающий мир и что его добавляют в некую фабрику. Как делают гуру?)

Добавлено через 25 минут
перешел на поиск английских топиков, понял что моя проблема заключается в механизме автоматической регистрации объектов в фабрике. но пока примера с ответом не нашел
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.04.2016, 11:27
Ответы с готовыми решениями:

Много пирожных
На кондитерской фабрике есть n видов пирожных, пирожных i-го вида на фабрике ai штук. Было принято решение отвезти пирожные на продажу на...

Кому должен принадлежать курортный бизнес в современной России? Кто должен осваивать Крым?
Кому должен принадлежать курортный бизнес в современной России? В СССР например, курортный бизнес (курортная мафия) всегда принадлежала...

Зачем регистрировать класс таким образом?
ATOM MyRegisterClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW |...

12
Эксперт .NET
 Аватар для Usaga
14138 / 9366 / 1350
Регистрация: 21.01.2016
Сообщений: 35,219
12.04.2016, 12:41
xTr1m, тебе нужен "корень композиции" - некое место в коде, откуда "расходятся" все зависимости и где будет происходить настройка фабрик/локаторов. В любом приложении есть как минимум одно такое место (main или Application или подобное).
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
12.04.2016, 14:58  [ТС]
Вы знаете, за ссылку спасибо, там тоже много нового для меня)) но все-таки мне кажется, что мне нужна именно саморегистрация класса в фабрике. У меня есть приложение и мне нужно, чтобы для добавления нового функционала нужно было добавить лишь h/cpp файл. и всё само подцепилось и заиграло. а этого я могу достичь лишь тогда, когда класс сам будет давать о себе знать. вот только работающего примера не вижу. был один, но там есть затык с порядком инициализации статических переменных. то есть, иногда работает, а иногда нет)) стандарт оказывается это не оговаривает. вроде бы частая штука должна быть?(
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.04.2016, 15:09
Цитата Сообщение от xTr1m Посмотреть сообщение
У меня есть приложение и мне нужно, чтобы для добавления нового функционала нужно было добавить лишь h/cpp файл.
Единственный минус паттерна фабрика - сложность добавления новых типов продуктов.
Цитата Сообщение от xTr1m Посмотреть сообщение
вроде бы частая штука должна быть?
Угу. У Борланда оно к примеру один раз использовано, с регистрацией классов. Для этого упахана куча расширений синтаксиса типа оператора __classid, для подключаемых классов существует единая сигнатура конструктора (для имитации дельфовских виртуальных конструкторов), и все равно подключаемый модуль при подключении должен явно вызвать функцию регистрации каждого класса в фабрике.
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
12.04.2016, 15:22  [ТС]
То есть я зря ищу "святой грааль"?) Нашёл я один пример, но там всё равно в каждом классе нужно явно "дернуть функцию" регистрации. а хотелось ведь, чтобы код был написан так, чтобы если не вызвал регистрацию, то компилятор ругнулся бы.
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.04.2016, 15:24
Цитата Сообщение от xTr1m Посмотреть сообщение
а хотелось ведь, чтобы код был написан так, чтобы если не вызвал регистрацию, то компилятор ругнулся бы.
Гораздо проще сделать так чтобы рантайм ругулся "не знаю такого"
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
12.04.2016, 15:32  [ТС]
Так в райнтайме я не знаю что должно быть.Плюс я еще планирую типа плагинов делать, а значит точно нужно на этапе компиляции
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
12.04.2016, 15:39
Цитата Сообщение от xTr1m Посмотреть сообщение
Плюс я еще планирую типа плагинов делать,
Плагины это модули подключаемые в рантайме вообще то. У борланда кстати так и сделано. Каждый пэкадж фактически DLL. При его подгрузке из него импортируется и вызывается вызывается функция, которая регистрирует все компоненты пэкаджа в фабрике.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.04.2016, 19:49
Цитата Сообщение от xTr1m Посмотреть сообщение
Но задумался, ведь чтобы добавить новый класс, нужно каждый раз не забыть добавить его в фабрику. Получается, что нужна функция класса, которая сама себя как бы регистрирует. Но нормально ли это, ведь класс не должен вроде бы ничего знать про окружающий мир и что его добавляют в некую фабрику.
класс сам себя не зарегистрирует.

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

вопрос лишь в том,
сколько придется при этом написать кода.

в остальном, чем меньше знает класс об окружающем мире,
тем он проще, и тем проще с ним работать.

ну а вообще, помимо классической "внешней регистрации",
есть подходы наподобие:


C++
1
2
3
// любой кто унаследуется от шаблона,
// будет зарегистрирован автоматически.
struct some: registration<some> { ... }
ну или так:

C++
1
2
3
4
5
6
// тоже самое, только без наследования
// что позволяет спрятать код регистрации в cpp файле
some::some()
{
    registration<some>(*this);
}

вам нужно понять:
лучше так, как тупо удобнее, и проще.
0
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
12.04.2016, 23:34  [ТС]
Спасибо. В результате я так и сделал, каждый объект представляет собой что-то типа
C++
1
2
class A : public ObjImpl<A>
{...}
а уже в этом базовом классе есть статическая переменная, которая при инициализации дергает некую функцию фабрики и гарантирует авторегистрацию. Другое дело, что для идентификации класса я использовал платформо-зависимое typeid. Но пока с этим смерился. Не хочется в каждом классе объявлять статическую переменную ит называть ее. Ведь можно и забыть. Да и опять этот порядок инициализации статических членов: что раньше наступит? инициализация имени класса или инициализация переменной, отвечающей за авторегистрацию?
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
13.04.2016, 15:07
Цитата Сообщение от xTr1m Посмотреть сообщение
а хотелось ведь, чтобы код был написан так, чтобы если не вызвал регистрацию, то компилятор ругнулся бы
Однозначно это будет код компилятора.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
13.04.2016, 19:06
Цитата Сообщение от xTr1m Посмотреть сообщение
Другое дело, что для идентификации класса я использовал платформо-зависимое typeid. Но пока с этим смерился. Не хочется в каждом классе объявлять статическую переменную ит называть ее. Ведь можно и забыть. Да и опять этот порядок инициализации статических членов
фундаментальные статические константы
гарантированно имеют иммунитет против static-order-fiasco

собственно, поэтому их можно опредять прямо в хедерах.
и это можно использовать:

http://rextester.com/CCDU88408
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <typeinfo>
 
 
template<class T> struct reg
{
    // адреса функций - гарантированно уникальны
    // и их можно использовать в качестве
    // автоматических идентификаторов 
    // времени выполнения
    static size_t id() 
    { 
        std::cout <<"auto registration: " 
            << typeid(T).name()
        <<std::endl;
        
        return (size_t)&id;
    }
    
private:
    // статические интегральные константы имеют иммунитет
    // против неопределенного порядка инициализации
    // единиц трансляций
    static const int auto_ = (id(), 0);
};
 
struct some: reg<some>
{
    some() { std::cout <<"some: my id = " << this->id() <<std::endl; }
};
    
struct foo: reg<foo>
{
    foo() { std::cout <<"foo: my id = " << this->id() <<std::endl; }
};
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    some s;
    foo  f;
}
2
29 / 29 / 16
Регистрация: 06.03.2013
Сообщений: 159
14.04.2016, 17:24  [ТС]
Wow. Крутой подход. Использовал у себя. Большое спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.04.2016, 17:24
Помогаю со студенческими работами здесь

Описать абстрактный класс породить от него еще два,один должен остаться абстрактным,другой должен быть способен пораждать объекты
Знает кто как сделать?

Опишите координационный класс. Класс должен состоять из двух целых чисел k, n (k <n)
Опишите координационный класс. Класс должен состоять из двух целых чисел k, n (k &lt;n). Создайте метод, который вычисляет значение по...

Создайте класс, в котором есть ostream& operator<<. Класс должен содержать очередь с приоритетом
Создайте класс, в котором есть ostream&amp; operator&lt;&lt;. Класс должен содержать очередь с приоритетом. Создайте генератор — заполнитель очереди...

Кто должен резать макет?
Всем доброго времени суток! Работаю верстальщиком, столкнулся с такой дилеммой, кто же все-таки должен резать макет? Дизайнер или...

кто должен заплатить за порванные рекламой динамики на телевизоре?
Подарил отцу телевизор, тот жалуется что немного плохо слышит и прибавляет звук. Уходим по делам, тот оставляет телевизор включённым,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru