Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
народ, вам не кажется, что шалон enable_shared_from_this сделан плохо? от него надо наследоваться обязательно public, но это по большому счету не верно, ведь это больше деталь реализации. я бы хотел наследоваться от него только protected, что было бы логически верно. например, если я пишу класс автомобиля, то мой авто - это не enable_shared_from_this, это например запорожец или ферари, но не enable_shared_from_this в связи с этим я попытался сделать его protected, а в друзья добавить какой-нибудь класс, который это реализует. но я так понял, что это, в общем случаи, не возможно :( вы не пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2016, 12:45 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_blackнарод, вам не кажется, что шалон enable_shared_from_this сделан плохо? от него надо наследоваться обязательно public, но это по большому счету не верно, ведь это больше деталь реализации. я бы хотел наследоваться от него только protected, что было бы логически верно. Нет, не кажется. Это не деталь реализации. Объект поддерживающий shared_from_this например нельзя создавать на стеке, поэтому юзер класса должен об этом знать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2016, 13:09 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
почему нельзя? если не вызывать shared_from_this то можно :) а юзер узнает когда она упадет. все равно ведь чтобы это узнать ему нужно заглянуть в список наследования. а там он может увидеть и protected. да и вобще, в таком случаи лучше сделать какой-нибудь атрибут, вроде on_heap_only или такой класс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2016, 13:19 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_blackа юзер узнает когда она упадет. Вот чтобы юзер этого не узнал, Anatoly Moskovskyюзер класса должен узнать об этом на этапе компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2016, 06:02 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
[quot alexy_black]народ, вам не кажется, что шалон enable_shared_from_this сделан плохо? от него надо наследоваться обязательно public, но это по большому счету не верно, ведь это больше деталь реализации Нет, это не деталь реализации, а часть контракта интерфейса с клиентом данного класса, поэтому наследование должно быть публичным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.09.2016, 19:09 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
MasterZivконтракта интерфейса с клиентом данного классане понял. то есть если клиенты никогда не вызывают shared_from_this, эта функция вызывается только внутри класса? например я могу определить что-нибудь в духе Код: plaintext 1. 2. дальше я могу юзать это определение и не знать какой именно там указатель, а просто знать, что он не протухнет, пока он у меня есть. но потом дизан программы может измениться, и он не протухнет в любом случаи, так что я могу там поставить просто Код: plaintext 1. 2. или могу определить его как unique_pt r или intrussive_ptr . клиентам должно быть все равно какой это указатель, они же просто вызывают функции сущности (разумеется, за исключением фабрики, например). (если использовать unique_ptr, то нужно передавать его как rvalue, но так же можно передавать и shared_ptr, это даже эффективнее). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 11:25 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_blackMasterZivконтракта интерфейса с клиентом данного классане понял. то есть если клиенты никогда не вызывают shared_from_this, эта функция вызывается только внутри класса? Наоборот. Что ты понимаешь под "контрактом класса" или "интерфейсом" ? Погугли, почитай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 11:37 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
про контракты я заню. только в чем тут контракт? вот например такой класс не нарушит принципа лиски какой бы указатель тут ни использовался. Код: plaintext 1. 2. 3. 4. 5. 6. дальше такой класс может использовать foo_ptr вызываея его методы и все. классу some не нужно знать что foo_field_ - shared_ptr или еще что-нибудь в этом духе. у него есть указатель и ему без раницы какой он. если например это shared_ptr то перемещение будет полезным, потому что при копировании должно атомарно увеличится значение счетчика, а так просто перемащает указатель. зачем классу foo иметь публичного предка std::enable_shared_from_this<foo>, если он, например, вызывает shared_from_this только в одной из своих приватных функций? выходит, я могу, как бы, создать шаблонну функцию принимающюю ссылку на объект std::enable_shared_from_this<T> и вызывать для него shared_from_this. но если я захочу провести рефакторинг, то мне придется это менять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 12:04 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_blackпро контракты я заню. только в чем тут контракт? В том, что ты даёш пользователю возможность вызвать с экземпляром класса метод shared_from_this ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 16:15 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_black вот например такой класс не нарушит принципа лиски какой бы указатель тут ни использовался. Принцип Лисков тут ни при чём. alexy_blackдальше такой класс может использовать foo_ptr вызываея его методы и все. классу some не нужно знать что foo_field_ - shared_ptr или еще что-нибудь в этом духе. у него есть указатель и ему без раницы какой он. если например это shared_ptr то перемещение будет полезным, потому что при копировании должно атомарно увеличится значение счетчика, а так просто перемащает указатель. зачем классу foo иметь публичного предка std::enable_shared_from_this<foo>, если он, например, вызывает shared_from_this только в одной из своих приватных функций? выходит, я могу, как бы, создать шаблонну функцию принимающюю ссылку на объект std::enable_shared_from_this<T> и вызывать для него shared_from_this. но если я захочу провести рефакторинг, то мне придется это менять. У тебя тут в примере нет класса, который наследуется от std::enable_shared_from_this . Так что обсуждать нечего. И, боюсь, в твоей голове всё очень сильно перемешано, до возникновения лёгкого бардачка... авторзачем классу foo иметь публичного предка std::enable_shared_from_this<foo>, если он, например, вызывает shared_from_this только в одной из своих приватных функций? Если классу foo надо вызывать shared_from_this только внутри реализаций своих методов, то очевидно, что это -- фиксированный определённый скоуп, и там shared_ptr просто не нужен вообще. Если shared_from_this вызывается в реализации методов, а результат отдаётся наружу, то это уже становится частью интерфейса этого класса. Да, в таком случае можно наследоваться от std::enable_shared_from_this непублично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 16:25 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
Господа, о чем вы спорите? Класс, имеющий enable_shared_from_this, по-другому обрабатывается классом shared_ptr, причем это делается именно за счет того что enable_shared_from_this это публичный интерфейс, т.е. существует неявная конверсия к нему. Так что можно закрыть этот интерфейс, но тогда shared_ptr придется делать через одно место )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 19:27 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
класс some я привел в качестве примера использования указателя на какой-то объект. этому классу по баробану какой там указатель и является ли foo enable_shared_from_this или нет.. это пример того, что не обязательно такое должно быть в контракте. предположим у меня есть foo. я могу получать сигнал о том, что объект foo именился. в сигнале я бы хотел получить указатель на foo. для этого foo может держать у себя сигнал, и когда изменится активировать его. но вопрос - а что передать в параметрах? если передавать foo*, а мне потом понадобится shared_ptr<foo>, то да, я могу вызвать f->shared_from_this(). но это коряво - что если я потом захочу не shared_ptr использовать, а что-нибудь другое? если передавать сразу shared_ptr, то мне нужно наследоваться публично от std::enable_shared_from_this. и никакой это ни локальный скоуп. вот к примеру Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. тут все работает, но смущает что это foo "есть" std::enable_shared_from_this, до чего другим классам и дела нет. это типичный случай, когда нужно делать наследование protected. публичное наследование хорошо подходит, если хочешь всем сообщить, что ты всегда будешь заворачиваться в shared_ptr. но если ты хочешь одним typedef'ом поменять место, куда будешь заворачивать объект, тогда лучше наследоваться protected, так ты говоришь, что это деталь реализации. но stl этого не позволяет. как и boost. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 20:55 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, что определяет что это через "одно место"? просто тебе нужно где-нибудь внутри класса получить shared_ptr на себя. если какой-то оъект имеет другие объекты, контейнер как бы. при добавлении к нему объекта, возомжно, нужно будте передать ему указатель на себя, чтобы он мог сделать из него weak и хранить у себя. для этого внутри класс тебе понадобится получить shared_ptr на this. вот почему бы и не наследоваться protected в таком случаи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 21:02 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_black, Я же объяснил выше уже. У класса реализующего shared_from_this есть как минимум один гарантированный пользователь - это конструктор класса shared_ptr. И ему для работы нужно чтобы наследование от enable_shared_from_this было публичным, т.к. он работает с объектом через интерфейс enable_shared_from_this . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 21:59 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyalexy_black, Я же объяснил выше уже. У класса реализующего shared_from_this есть как минимум один гарантированный пользователь - это конструктор класса shared_ptr. И ему для работы нужно чтобы наследование от enable_shared_from_this было публичным, т.к. он работает с объектом через интерфейс enable_shared_from_this . да, вот я об этом и говорю. а я хочу чтобы оно было protected. я даже готов добавить этот конструктор в друзья. но так не получяется :( ну или я что-то не так делаю. там какие-то уродские шаблонные классы нужно добавлять, и, я так понял, они специфичны для реализации библиотеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 23:28 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_blackа я хочу чтобы оно было protected Это невозможно реализовать. Для того чтобы shared_ptr имел доступ к полям и функциям внутри enable_shared_from_this через наследник S (а это нужно потому что именно shared_ptr инициализирует в объекте ссылку), должно существовать преобразование от S* к enable_shared_from_this<S>* , а это возможно только если наследование публичное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.10.2016, 23:51 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyalexy_blackа я хочу чтобы оно было protected Это невозможно реализовать. ... это возможно только если наследование публичное.вы прочитали что я писал? опа Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:11 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_black, То что вы предлагаете, подразумевает что каждый юзерский класс должен описывать friend для всех внутренностей shared_ptr. Это то что я назвал "через одно место" Хотели большей инкапсуляции, а получили полную зависимость от реализации shared_ptr. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 13:44 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyalexy_black, То что вы предлагаете, подразумевает что каждый юзерский класс должен описывать friend для всех внутренностей shared_ptr. Это то что я назвал "через одно место" Хотели большей инкапсуляции, а получили полную зависимость от реализации shared_ptr.вот и выразили смысл моего первого поста. я бы хотел чтобы можно было добавить какой-нибудь класс в друзья и это бы гарантированно разрешало protected наследование. но в реале так нельзя сделать, потом учто полуится именно что через одно место. это проиходит не из-за ограничений языка, а из-за такой реализации enable_shared_from_this. а публичное наследование в некоторых случаях логически не верно. вот то, о чем я тут и пишу :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 14:35 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_blackэто проиходит не из-за ограничений языка, а из-за такой реализации enable_shared_from_this. Нет, это происходит от того что вы не понимаете как устроен shared_ptr )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 15:17 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky, и чего же я не понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 15:21 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_blackи чего же я не понимаю? Того, что там гораздо больше функциональности чем в том примитивном примере что вы привели и она разнесена по многим классам и функциям. И никто не будет заставлять юзера разбираться где какие friend ставить, и в прочие детали реализации вникать. А вы можете и дальше думать что это ограничения ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 15:47 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
думаю можно создать шаблонный класс для нужд shred_from_this, который и объявить другом. это не добавит реального ассемблерного кода (потому что функция из одной строчки просто встроится), но зато разрешит protected наследование. Anatoly Moskovsky, у меня склдывается впечатление, что вы то, что я пишу читаете по диагонали, и отвечаете на недочитанные предложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 17:53 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
alexy_black, Я вам еще раз говорю прямым текстом. Дизайн, где в пользовательском коде требуется оператор friend для служебного кода - ужасный. Именно поэтому так как вы хотите создатели этой либы не сделали и не будут делать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 18:06 |
|
||
|
public enable_shared_from_this
|
|||
|---|---|---|---|
|
#18+
например было бы круто Код: plaintext 1. 2. 3. 4. 5. что-то подобное используют для сериализации например иногда. Anatoly Moskovsky, так мое впечатление было правильным? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.10.2016, 23:39 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39320551&tid=2018413]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
62ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 11ms |
| total: | 171ms |

| 0 / 0 |
