|
|
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
Вы уж простите мой флуд такой. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. То есть, модифицировать объект родитель в объект потомок :) Можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 10:04 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
Если "в лоб", тогда то, что ты хочешь, можно сделать двумя способами: 1) Конструктор CHILD, принимая указатель на BASE, выполнит всю необходимую инициализацию и удалит b. 2) Если при удалении CHILD должен удаляться и соотв. переданный BASE, то хранить переданный указатель и докрутить деструктор CHILD чтобы он удалял все сразу. Вот так по-рабочекрестьянски: Код: 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. Оба варианта, на самом деле плохие, потому что во-первых можно недосмотреть и вызвать delete дважды для уже удаленного объекта. Во-вторых допускают конструкции вида Код: plaintext 1. 2. 3. 4. 5. Получите Segmentation fault и распишитесь. Твое "потому что они как-бы стали одним объектом" на самом деле означает, что мы присвоив объект B другому объекту С (через конструктор, оператор присваивания, еще как-нибудь, не важно) должны воспользоваться информацией из него, сохранить все что надо в С и после этого забыть про B , т.к. все что в нем было теперь стало "сущностью" С . Если это то, что требуется, то рекомендую почитать толстую книжку по С++, где есть глава про умные указатели (smart pointers). Возможно натолкнет на какие-нть идеи :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 10:53 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
в лоб и порабочекрестьянски я и сам умею :) я думал, может компилятор умеет этого без меня :) То есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 12:19 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
alex_kТо есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов?Компилятор пока еще, к сожалению, не умеет читать мысли программера, а посему не может догадаться что тот хочет получить в результате такого приведения типов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 12:31 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
чтение мыслей тут ни причем. когда мы вызываем конструктор предка, мы, по сути, создаем объект класса предка. так, вот. Если мы уже имеем созданный объект класса предка, то зачем нам вызывать конструктор предка? Пусть компилятор на его основе создаст объект класса потомка, естественно через конструктор потомка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 12:55 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
alex_kв лоб и порабочекрестьянски я и сам умею :) я думал, может компилятор умеет этого без меня :) Насколько я понимаю вам нужно понять разницу между типом данных ( класс) и переменной этого типа (обьект). Если создается переменная типа базовый класс то и позаботься об удалении должен тот кто его создает. Если создается переменная типа класс наследник, то она автоматически включает в себя все поля данных и методы базового класса. Копилятор же может гарантировать автоматическое удаление только при выходе из области видимости. Если это наследник то все что было создано автоматически будет и удалено автоматически. alex_k То есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов? Если говорить о превращении то в чистом виде их делают с помощью static_cast & dynamic_cast. И путаницы с типами может стать еще больше, по этой причине я их не использую . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 13:05 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
похоже, меня никто не понял. значит это не актуально. забейте :) спасибо за внимание ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 13:10 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
alex_kчтение мыслей тут ни причем. когда мы вызываем конструктор предка, мы, по сути, создаем объект класса предка. так, вот. Если мы уже имеем созданный объект класса предка, то зачем нам вызывать конструктор предка? Пусть компилятор на его основе создаст объект класса потомка, естественно через конструктор потомка. При создании класса наследника конструктор предка вызывается автоматом. явно вызывать его не надо. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 13:19 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
[quot alex_k]Вы уж простите мой флуд такой. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. То есть, модифицировать объект родитель в объект потомок :) Можно? Объект b можно модифицировать везде, где есть ссылка на него в соответствие с общими правилами работы с ним. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 21:26 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
Если "в лоб", тогда то, что ты хочешь, можно сделать двумя способами: 1) Конструктор CHILD, принимая указатель на BASE, выполнит всю необходимую инициализацию и удалит b. Нельзя. Т.е. никто не запрещает, но это -- очень плохо, криво. Не конструктор CHILD::CHILD его создавал, не он и удалять должен. К тому же указатель может быть на нединамический объект -- его удалять нельзя в принципе. Какой это объект CHILD::CHILD не знает и знать не может. 2) Если при удалении CHILD должен удаляться и соотв. переданный BASE, то хранить переданный указатель и докрутить деструктор CHILD чтобы он удалял все сразу. Вот так по-рабочекрестьянски: Тоже как бы неправильно. Удалять должен только агрегат, если он есть. CHILD не агригирует BASE, иначе он бы был ответственным за его создание, и значит удалять должен не он. Оба варианта, на самом деле плохие, потому что во-первых можно Я бы сказал просто - потому что они плохие. Единственно правильный вариант - использовать в конструкторе CHILD указатель на BASE и скопировать его данные в свой родительский подобъект, вызвав конструктор копирования BASE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2006, 21:32 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
alex_kТо есть, превращение объекта базового класса в объект производного класса возможно только если я заранее о таком превращении позабочусь на уровне обоих классов? Превращение объекта базового класса в объект производного класса вообще невозможно НИКОГДА в С++. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2006, 09:47 |
|
||
|
хитрое создание объектов - 3
|
|||
|---|---|---|---|
|
#18+
когда мы вызываем конструктор предка, мы, по сути, создаем объект класса предка. Не создаем, а инициализируем уже созданный объект (хотя конечно инициализация - это часть создания объекта). так, вот. Если мы уже имеем созданный объект класса предка, то зачем нам вызывать конструктор предка? Другой объект класса предка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2006, 09:49 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33506151&tid=2032059]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
176ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
| others: | 256ms |
| total: | 526ms |

| 0 / 0 |
