Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Имеется абстрактный класс Record, от которого унаследованы не виртуальные классы Comment и Shape_definition. Я бы хотел написать примерно такой код: Код: plaintext 1. 2. 3. Я переопределил операторы >> для каждого класса. Тот, который относится к Record, предварительно выглядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Т.е. в зависимости от того, что во входном потоке, выполняется оператор >> либо для Comment, либо для Shape_definition, сохраняя полученное значение в record. Однако, как известно, создать объект абстрактного класса нельзя. Отсюда вопрос: как бы мне правильней инициализировать Record& record? Можно, конечно попробовать как-то так: Код: plaintext 1. 2. 3. Но что-то мне этот способ не нравится... Могут ли быть какие-то подводные камни в случае использования этих вариантов? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 14:50 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Compositum, Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 15:52 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
мне бы не хотелось использовать в данном случае указатели и сборщик мусора. Указанный мною выше способ может вызывать проблемы? Если "да", то какие? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:23 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Compositumмне бы не хотелось использовать в данном случае указатели и сборщик мусора. Указанный мною выше способ может вызывать проблемы? Если "да", то какие? Какой-такой сборщик мусора ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:25 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
MasterZivКакой-такой сборщик мусора ? обыкновенный . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:27 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Compositum, по стандарту можно инициализировать только константную ссылку временным объектом: Код: plaintext 1. А так, я не очень понял твою задумку - ну инициализируешь ты ссылку, дальше что? ну прочтешь данные - а что после с этим объектом-то будет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:31 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковА так, я не очень понял твою задумку - ну инициализируешь ты ссылку, дальше что? дальше читаю нужные данные из потока, назначая результат этой самой ссылке. Анатолий Широковну прочтешь данные - а что после с этим объектом-то будет? Ничего, будет жить, пока ссылочная переменная находится в области видимости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:40 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковА так, я не очень понял твою задумку Задумка в том, чтобы воспользоваться полиморфизмом. Поскольку переменная является ссылкой на базовый класс, то виртуальный метод draw будет вызван на объекте реального класса. На основании маркера класса, возвращается экземпляр нужного (по контексту) производного класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:43 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Compositum, Перечитал твой первый пост. Возникает единственный вопрос - а зачем ты вообще наследование используешь, если у тебя все "свалено" в Record? У тебя operator>> оперирует знаниями о природе классов Comment и Shape_definition. Тебя вот это не смущает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:47 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Анатолий ШироковУ тебя operator>> оперирует знаниями о природе классов Comment и Shape_definition. Тебя вот это не смущает? Откровенно говоря, смущает... Я бы хотел, чтобы эти классы имели общий интерфейс, соответственно получается, что они должны иметь общего родителя. Оператор >> должен на основании маркера автоматом распознавать, экземпляр какого именно дочернего класса должен создаваться. В результате у меня получилась такая петрушка... Если у тебя есть идея, как это реализовать более грамотно - буду признателен. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 16:58 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
CompositumДоброго времени суток. Но что-то мне этот способ не нравится... Могут ли быть какие-то подводные камни в случае использования этих вариантов? Спасибо. Тут не подводный камень. Тут большой подводно-надводный слон. Суть полиморфизма в том что используется ССЫЛКА или УКАЗАТЕЛЬ который УКАЗЫВАЕТ на объект реализующий абстрактный интерфейс. То есть _никакого копирования_, просто _инициализация ссылки_ или _присвоение (или инициализация) указателя_. Полиморфизм: Код: plaintext 1. 2. 3. А вы пытаетесь сделать так: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 17:03 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Пока что мне приходит в голову только вынос этого кода из абстрактного класса в отдельный класс, являющийся оболочкой над потоком: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 17:03 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
sherzod_, Честно говоря, я не понял. Ссылка является константной, т.е. она указывает всегда на одну и ту же ячейку памяти, в то время как указателю можно переназначать др. адреса. Когда я назначаю ссылке новое значение, то это новое значение записывается по адресу, на который указывает ссылка, перезаписывая старое значение. Если бы я использовал указатель, но назначая ему новое значение, я бы, тем самым, назначил ему лишь другую ячейку памяти, на которую он ссылается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 17:11 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Compositum, Ну, в своем первом посте я как раз показал как бы я действовал: 1. создал бы абстрактый класс Record только с чисто виртуальными функциями - это интерфейс Код: plaintext 1. 2. 3. 4. 5. 6. 7. 2. создал бы конкретный наследников Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 3. создал бы фабричный метод, читающий из потока и создающий по префиксу тот или иной объект Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 4. ну и напоследок все это связал Код: plaintext 1. 2. Вот это и был бы чистый ООП в действии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 17:19 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Анатолий Широков, Спасибо. Я внёс изменения в грамматику. Было: Код: sql 1. 2. 3. 4. 5. Стало так: Код: sql 1. 2. 3. 4. 5. Такой подход получается более простым и надёжным, чем тот, что я выбрал ранее. Исправленная версия грамматики подразумевает, что объект класса Record содержит в себе по экземпляру классов Comment и Shape_definition. Т.о. я избавился от иерархии наследования. Соответственно и фабрика не понадобится. Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 17:28 |
|
||
|
Предварительная инициализация ссылочной переменной абстрактного класса
|
|||
|---|---|---|---|
|
#18+
Давай вот это вот ещё раз обсудим. CompositumСсылка является константной, т.е. она указывает всегда на одну и ту же ячейку памяти, в то время как указателю можно переназначать др. адреса. Когда я назначаю ссылке новое значение, то это новое значение записывается по адресу, на который указывает ссылка, перезаписывая старое значение. Если бы я использовал указатель, но назначая ему новое значение, я бы, тем самым, назначил ему лишь другую ячейку памяти, на которую он ссылается. Всё правильно, про это тебе и говорил sherzod_ . Присвоил -- прощай полиморфизм. Тем более что так присваивать ссылке очень опасно -- может быть срезка. Record& record = Comment(); // record теперь может указывать не на Record, а на его наследника. someOtherRecord = OtherComment(); // someOtherRecord допустим указывает теперь на Record базовый. record = someOtherRecord; // вот тут будет происходит срезка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2013, 21:36 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38340984&tid=2020072]: |
0ms |
get settings: |
13ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
73ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
| others: | 312ms |
| total: | 497ms |

| 0 / 0 |
