@ProCxx

Страница 930 из 2477
Constantine
02.06.2017
15:51:23
инициализовать после конструктора, например

в make_derived_2

Александр
02.06.2017
15:51:52
Вооот, от этого я и пришёл. Контекст требуется уже внутри конструктора Derived, поэтому после - не получится

Constantine
02.06.2017
15:52:19
хм...

Google
Constantine
02.06.2017
15:52:36
в любом случае меня учили в книжках, что агрегация уменьшает связность

а зачем вообще нужен второй конструктор?

он же может быть использован только в make_derived_2

Александр
02.06.2017
15:53:47
Там в примере показаны две ситуации - нормальная, но не очень удобная и та, которую я хочу

В идеале нужно удалить конструктор Derived, который использует void*

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

Constantine
02.06.2017
15:54:39
фактически класс Derived при использовании конструктора 2 должен получить этот void*

все равно должен

все равно любой код, вызывающий этот конструктор, обязан знать этот void*

Александр
02.06.2017
15:55:25
Должен. Вот он получает его еще до того, как сам сконструировался

Constantine
02.06.2017
15:55:57
да, но получается, что выставляется требование проинициализировать Base перед вызовом конструктора

а это то же самое, что передать Base* в кажестве параметра при агрегации

Александр
02.06.2017
15:56:22
все равно любой код, вызывающий этот конструктор, обязан знать этот void*
Но если это будет шаблонная фабрика, скрытая в недрах библиотеки, то всё ок

Google
Constantine
02.06.2017
15:56:56
а в чем проблема шаблонной фабрики использовать способ 1?

Александр
02.06.2017
15:57:26
В том, что она требует от Derived дополнительного параметра в конструкторе void* context

Constantine
02.06.2017
15:58:10
я просто не могу никак понять, почему в данном случае _неявная_ передача параметра способом 2 вообще отличается от _явной_ способом 1, если параметр обязателен

Александр
02.06.2017
15:59:21
Неявная передача параметра способом 2 делается внутри шаблонной фабрики и пишется один раз. А первый способ требует в каждом наследнике Base (пусть их 100) писать долбаный параметр в конструктор, который вообще является частью внутреннего интерфейса библиотеки

Constantine
02.06.2017
16:00:16
понял

мы хотим, чтобы класс Derived42 не знал про то, как инициализируется Base и что он вообще инициализируется

Александр
02.06.2017
16:00:50
Ага

Constantine
02.06.2017
16:01:24
но при этом хочет его использовать

а нельзя сделать параметр конструктора отдельным типом?

и разрешить неявное преобразование дабла?

Александр
02.06.2017
16:03:38
Во-первых, конструктор там будет иметь любое кол-во аргументов

Про неявное преобразование не понял

Constantine
02.06.2017
16:03:54
ну я пишу

Derived(base_constructor_arguments_type a)

и разрешаю base_constructor_arguments_type(double)

Александр
02.06.2017
16:04:36
о_О

Зачем менять конструктор Derived?

А, и фабрика напрямую вызываться не будет, конечно

Она там внутри либы тоже болтается

Constantine
02.06.2017
16:10:44
для того, чтобы выполнить два условия: одновременно получить только нужные параметры и при этом получить еще один неявно

Google
Александр
02.06.2017
16:11:41
А можно пример? Я всё равно не понимаю, в чём идея

Constantine
02.06.2017
16:12:06
идея что вместо Derived(double, int) пишем сигнатуру Derived(helper<double, int>

где helper на самом деле еще содержит контекст

у меня пока возникла одна идея в случае агрегации: а нет гарантии, что если указано union{ Base* base; ??? }; то компилятор не будет инициализировать поле?

Александр
02.06.2017
16:13:17
Ага, но пользователь опять расстроен, что ему придётся писать код

В чём моя фабрика-то неправильная?)

идея что вместо Derived(double, int) пишем сигнатуру Derived(helper<double, int>
А, и всё равно придётся это передавать в конструктор Base, о чем опять грустит юзер

Constantine
02.06.2017
16:14:03
я подумал за логику и решил, что нельзя требовать с компилятора ничего не трогать в данном случае

Александр
02.06.2017
16:14:32
Предполагаем, что в базовом классе только указатель и какие-нибудь int, double, char

Constantine
02.06.2017
16:15:04
потому что переменная класса может быть объявлена в глобале, а у компилятора там обязанность все инициализировать

емнип, конечно

Александр
02.06.2017
16:15:58
??

Александр
02.06.2017
16:16:15
Чего? Это ж не статическое поле

Вот меня тоже только это смущает - что вызванный Base() по умолчанию потрёт контекст, записанный туда ранее

Constantine
02.06.2017
16:17:05
на кого распространяется правило инициализации при объявлении в глобале? только на int всякие или на все объекты?

Antony
02.06.2017
16:17:22
Есть вопрос к ненавистникам UB: http://cpp.sh/2rbzm внутри main()
Мракобесие... Не делайте так, у вас сойдут с ума санитайзеры и оптимизатор. Вам необходимо передавать контекст внутрь базового класса так, чтобы Derived ничего не знал об этом? Создайте в базовом классе private: static thread_local void* ctx; static void* get_context(); static void set_context(void*); Явно вызывайте get_context() в конструкторе базового. Сделайте frined template <class Derived> factory_method; внутри базового, в фабрике делайте set_context(); Но всё это выглядит как-то болезненно и неправильно, буд-то что-то неправльно с иерархией классов... Кстати, посмотрите библиотеку DI https://github.com/boost-experimental/di она решает вашу проблему

Constantine
02.06.2017
16:18:46
просто если такое правило распространяется на все объекты, я не верю, что стандарт требует, что инициализация блока памяти произойдет НЕ в момент вызова конструктора

то есть здесь моя "Б. Логика" требует, чтобы случай, когда конструктор явно не инициализирует переменные, считался UB

Google
Constantine
02.06.2017
16:20:41
это неявная передача параметра как раз

Александр
02.06.2017
16:20:44
С DI придётся юзера заставлять что-то писать (совсем не простое)

это неявная передача параметра как раз
Если имелось в виду это, то прошу прощения, не понял

Admin
ERROR: S client not available

Constantine
02.06.2017
16:22:05
да не, я почему-то не подумал, что можно в действительности ЯВНО написать НЕЯВНУЮ передачу параметра через thread_local

Александр
02.06.2017
16:23:06
Да thread_local можно было бы потом прикрутить, когда я вспомнил бы о потоках

Constantine
02.06.2017
16:23:07
интересно, у вижака есть известный мне note, распространяется ли он на thread_local

On Windows operating systems before Windows Vista, __declspec( thread ) has some limitations. If a DLL declares any data or object as __declspec( thread ), it can cause a protection fault if dynamically loaded. After the DLL is loaded with LoadLibrary, it causes system failure whenever the code references the __declspec( thread ) data. Because the global variable space for a thread is allocated at run time, the size of this space is based on a calculation of the requirements of the application plus the requirements of all the DLLs that are statically linked. When you use LoadLibrary, you cannot extend this space to allow for the thread local variables declared with __declspec( thread ). Use the TLS APIs, such as TlsAlloc, in your DLL to allocate TLS if the DLL might be loaded with LoadLibrary.

Antony
02.06.2017
16:24:17
Неазчто :)

интересно, у вижака есть известный мне note, распространяется ли он на thread_local
Да, распространяется и на thread_local. Немного вот тут описана печаль: http://www.boost.org/doc/libs/1_64_0/doc/html/boost_dll/missuses.html А именно: Issue: Thread local storage seems to be corrupted. Fix: Some platforms have no out-of-the-box support for plugins that use TLS, for example Windows. Use platform specific workarounds or just do not use TLS in plugins.

Constantine
02.06.2017
16:27:10
я так и подозревал ?

Antony
02.06.2017
16:28:11
Но вы эту проблему заметите только если ручками подгружаете библиотеку (используете плагины). Если вы библиотеку прилинковали - то всй нормально.

Constantine
02.06.2017
16:30:36
спасибо за заботу :) я не первый день в вин разработке, так что в целом понятен текст, который пишут на MSDN :)

собственно, я знаю, потому что у нас используется thread_local и это ограничение к dll в хелпе приписано

Antony
02.06.2017
16:32:23
спасибо за заботу :) я не первый день в вин разработке, так что в целом понятен текст, который пишут на MSDN :)
:) Мне он всегда не понятен. Приходится вдуплять по часу на каждую страницу

Constantine
02.06.2017
16:32:55
при этом можно неплохо огрести, например, SetWindowsHookEx не с _LL будет подгружать библиотеку через LoadLibrary

Vitaly
02.06.2017
16:36:29
Обсуждение IDE - в #supapro.

Constantine
02.06.2017
16:37:05
флудить-то не запрещайте мимими

Google
Vitaly
02.06.2017
16:37:19
Stanislav
02.06.2017
16:37:56
Vladislav
02.06.2017
16:39:11
Холивары - в @pro.cxx.holywars)

#holywar

Group Butler [beta]
02.06.2017
16:39:24
#holywar
С таким заявлением вам лучше сюда: pro.cxx.holywars

Constantine
02.06.2017
16:39:47
вообще, ловите идею: автоматически синтезировать подконфу для обсуждения тем

Constantine
02.06.2017
16:42:25
собственно, у меня нет идей как по-другому не превращать любую конфу во <s>флуд</s> объяснение, как работает std::move

Александр
02.06.2017
16:43:00
:D

Alex Фэils?︙
02.06.2017
16:45:08
#chatlist

Group Butler [beta]
02.06.2017
16:45:08
#chatlist
Другие чаты ? @ProCxx – чат для серьезных вопросов; ? @ProCxxLib – библиотека книг по языку C++, проектированию и программированию; ? @ProCxxNews – новости из мира C++, интересные статьи и пр. ? @ProAlgorithms – чат по обсуждению вопросов проектирования, архитектуры программного обесепечения; ? @ProLua – чатик по скриптовому языку Lua; ? @fludpac – флудилка, чат по обсуждению всего; ? @xthon – канал с цитатами участников pro.* ? @prodot – канал pro.*; ? @flood – общий флуд канала @prodot; ? supapro.cxx – чат помощи для новичков; ? pro.git – чат по обсуждению Git; ⚔ pro.cxx.holywars – чат для любителей холиваров; ?pro.net – чат по .NET Framework; ?pro.linux – чат по Линуксу; ?pro.linux.old – самая первая группа из коллекции pro.*. Вход по инвайтам, т.к. создатель группы удалился из telegram; ? Opengl / opencl / Vulkan / etc gamedev – no-flood-чат по опенглу и пр. Читайте правила при входе! Пока не в системе pro.* English chats ❤️ @undertale_chat – chat about the Undertale game; ?? pro.english – chat about learning English.

Alex Фэils?︙
02.06.2017
16:45:16
вот вам набор ссылок

Vladislav
02.06.2017
16:45:28
Другие чаты ? @ProCxx – чат для серьезных вопросов; ? @ProCxxLib – библиотека книг по языку C++, проектированию и программированию; ? @ProCxxNews – новости из мира C++, интересные статьи и пр. ? @ProAlgorithms – чат по обсуждению вопросов проектирования, архитектуры программного обесепечения; ? @ProLua – чатик по скриптовому языку Lua; ? @fludpac – флудилка, чат по обсуждению всего; ? @xthon – канал с цитатами участников pro.* ? @prodot – канал pro.*; ? @flood – общий флуд канала @prodot; ? supapro.cxx – чат помощи для новичков; ? pro.git – чат по обсуждению Git; ⚔ pro.cxx.holywars – чат для любителей холиваров; ?pro.net – чат по .NET Framework; ?pro.linux – чат по Линуксу; ?pro.linux.old – самая первая группа из коллекции pro.*. Вход по инвайтам, т.к. создатель группы удалился из telegram; ? Opengl / opencl / Vulkan / etc gamedev – no-flood-чат по опенглу и пр. Читайте правила при входе! Пока не в системе pro.* English chats ❤️ @undertale_chat – chat about the Undertale game; ?? pro.english – chat about learning English.
Мафии нету

Alex Фэils?︙
02.06.2017
16:45:50
какая к дьяволу мафия с открытым инвайтом? ;)

Страница 930 из 2477