|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Добрый вечер, хотелось чтобы приведенный код выводил ABC (сейчас выводит AAA) Без использования ссылок (& и ->) т.е. без адресации руками, в чистом плюсовом стиле. Код: 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. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 20:15 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018, Всё очень просто. По шагам: 1) Найти и понять причину такого поведения 2) Поставить задачу на конкретные изменения 3) Изобразить в коде Начинайте с первого. Где и почему код так себя ведёт? (круглый) ЗЫ Либо бросайте это всё нафик - это не Ваше. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 20:40 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:14 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Фэйтл Эра, так, конечно, работает, но хотелось бы реализовать без передачи адресов объектов руками. Конструкторы копирования как то переопределить... Чтобы при помещении в контейнер объекты оставались своего типа, а не приводились к базовому. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:26 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018Чтобы при помещении в контейнер объекты оставались своего типа, а не приводились к базовому. Ты сам объявил контейнер объектов базового типа. Так что обломись. Не хочешь связываться с передачей адресов руками - делай контейнер умных указателей. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:44 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:51 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018сейчас выводит AAAпоздравляю, ты изобрёл срезку )) Candid2018Без использования ссылок (& и ->) т.е. без адресации руками, в чистом плюсовом стиле. в чисто явском стиле, ты хотел сказать, да?)) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:55 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Насколько я понимаю СТЛ коллекция должна заранее знать размер помещаемого объекта в коллецию Размеры B и A разные поэтому при попытке положить B происходит его каст к A и копирование. Разумеется при этом слетает начиста все таблицы виртуальных методов и ты видишь неверную печать Возможно так станет понятнее Код: 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. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
--положить B происходит его каст к A и копирование Оригинальный объект B передается в конструктор копирования A Никакого каста не происходит ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 21:59 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenпри попытке положить B происходит его каст к A и копирование.происходит не каст, а срезка, то есть данные, характерные для класса B просто теряются, в том и числе и таблица виртуальных функций. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:06 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Модератор: Перестань задирать людей. Исправлять свои ошибки хорошо, исправлять чужие тоже хорошо. Обижаться что тебя поправили - очень не хорошо. White Owl ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:11 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, спасибо. Данный код решает проблему Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:40 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018Dimitry Sibiryakov, спасибо. Данный код решает проблему Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Может лучше std::make_unique ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:42 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenМожет лучше std::make_unique ? Предлагаю подумать что будет в этом случае с таким кодом: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:53 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Anatoly Moskovskysemen.s.semenМожет лучше std::make_unique ? Предлагаю подумать что будет в этом случае с таким кодом: Код: plaintext 1. 2. 3. 4. 5.
Да ступил unique_ptr не работает тут vector<unique_ptr<A>> vA; vA.push_back(std::make_unique<A>()); vA.push_back(std::make_unique<B>()); vA.push_back(std::make_unique<C>()); for(auto v:vA) v->print(); Не компилится ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:56 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Anatoly Moskovskysemen.s.semenМожет лучше std::make_unique ? Предлагаю подумать что будет в этом случае с таким кодом: Код: plaintext 1. 2. 3. 4. 5.
Так Сём Сёмыч не предлагает менять тип в контейнере, только вызывать, make_unique вместо make_shared. Его право. Это даже скомпилируется и будет работать. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:57 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Вот так работает ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:57 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZЭто даже скомпилируется и будет работать. Не скомпилируется и работать не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenВот так работает Лучше сделать print() const'ом и итерироваться по const-ссылкам ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenНе компилится А, ну да. Правда я имел ввиду другое, но компилятор умнее )) А чтобы unique_ptr применить надо for (auto& v...) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:58 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenNekZЭто даже скомпилируется и будет работать. Не скомпилируется и работать не будет Почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:59 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenпропущено... Не скомпилируется и работать не будет Почему? error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A> >' for (auto v : vA) Потому ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 22:59 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenВот так работает Лучше сделать print() const'ом и итерироваться по const-ссылкам Почему ? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:03 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenNekZпропущено... Почему? error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A> >' for (auto v : vA) Потому Ты не вник в то, что я написал, да? Как обычно, это твоя фича. Я написал, что не обязательно менять тип в контейнере. Можно спокойно делать Код: plaintext 1. 2.
Т.к. shared_ptr имеет конструктор из unique_ptr&& ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:04 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenпропущено... error: call to implicitly-deleted copy constructor of 'std::__1::unique_ptr<A, std::__1::default_delete<A> >' for (auto v : vA) Потому Ты не вник в то, что я написал, да? Как обычно, это твоя фича. Я написал, что не обязательно менять тип в контейнере. Можно спокойно делать Код: plaintext 1. 2.
Т.к. shared_ptr имеет конструктор из unique_ptr&& А еще он имеет целый int для подсчета ссылок Прикинь какой оверхед - если вектор огромный ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:05 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenNekZпропущено... Лучше сделать print() const'ом и итерироваться по const-ссылкам Почему ? Потому что print() не меняет внутреннее состояние объекта, следовательно, он должен быть const. Читай C++ Core Guidelines . ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:06 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenпропущено... Почему ? Потому что print() не меняет внутреннее состояние объекта, следовательно, он должен быть const. Читай C++ Core Guidelines . То есть никакого реального профита кроме эстетики Понятно ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:06 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenА еще он имеет целый int для подсчета ссылок Прикинь какой оверхед - если вектор огромный То есть, твой аргумент что оно не скомпилится и не будет работать можно отправлять в /dev/null ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:07 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenпропущено... Почему ? Потому что print() не меняет внутреннее состояние объекта, следовательно, он должен быть const. Читай C++ Core Guidelines . Я просто ожидал услышать чудеса С++ ной экспертизы Ну например что нить типа сегментов константой памяти проход по которой быстрее или типа А тут все банальное задротство с констом ) ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:07 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenА еще он имеет целый int для подсчета ссылок Прикинь какой оверхед - если вектор огромный То есть, твой аргумент что оно не скомпилится и не будет работать можно отправлять в /dev/null Я привел свой вариант с unique_ptr - смотри выше по форуму. ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:08 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenNekZпропущено... Потому что print() не меняет внутреннее состояние объекта, следовательно, он должен быть const. Читай C++ Core Guidelines . То есть никакого реального профита кроме эстетики Понятно Переведу для тебя. Ты, видимо, на третьем курсе, у вас с английским ещё не ок. C++CGThis gives a more precise statement of design intent, better readability, more errors caught by the compiler, and sometimes more optimization opportunities. Это даёт выражение более точных намерений, лучшей читабельности, больше пойманных компилятором ошибок и ещё иногда открывает возможности для оптимизации . Разве не ты ли тут фанбой по последнему пункту? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:11 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
semen.s.semenЯ привел свой вариант с unique_ptr - смотри выше по форуму. Ты в курсе, что он никого не удивляет, как и 2+2 = 4? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:12 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
NekZsemen.s.semenЯ привел свой вариант с unique_ptr - смотри выше по форуму. Ты в курсе, что он никого не удивляет, как и 2+2 = 4? А твой GuidLine с констом типа удивляет ... |
|||
:
Нравится:
Не нравится:
|
|||
26.12.2018, 23:14 |
|
наследование виртуальные функции без ссылок
|
|||
---|---|---|---|
#18+
Candid2018Добрый вечер, хотелось чтобы приведенный код выводил ABC (сейчас выводит AAA) Без использования ссылок (& и ->) т.е. без адресации руками, в чистом плюсовом стиле. лабуда выходит после перевода: "как выдать указатель не используя операторов получения адреса?" а зачем вам вообще объект? передавайте просто ссылку на функцию ... |
|||
:
Нравится:
Не нравится:
|
|||
27.12.2018, 11:34 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017693]: |
0ms |
get settings: |
12ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
33ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 254ms |
total: | 401ms |
0 / 0 |