|
|
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. или придется делать так? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. честно говоря мне второй вариант кажется некрасивым, а я привык что в С++ красивые решения должны преобладать над некрасивыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 05:39 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
по мне главное что бы решение было эффективно, а красивости ф топку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 08:17 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
эффективность один из компонентов красоты :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2006, 08:18 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Первый вариант прокатит. Только я не понял второго куска - struct PARENT { CHILD c1(this);//вот как-то чтобы в конструктор автоматом передался CHILD c2(this);//создаваемый объект PARENT }; - это невалидный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2006, 15:17 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
чего сделать то пытаетесь? А то ссылка на потомка в базовом классе - это как-то странно выглядет :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.01.2006, 17:25 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
я хочу чтобы при создании PARENT автоматически создавался объект CHILD но это возможно только с конструктором по умолчанию. а мне хочется чтобы автоматически вызывался параметризированный конструктор. вот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 09:06 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
ладно. ссылка на потомка это действительно странно хотя и реально :) а вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. вот у CHILD_B объект класса CHILD_A создасться конструктором по умолчанию. и парент придется потом указывать в ручную. а хочется чтобы парент автоматически указывался при создании. это можно сделать в конструкторе CHILD_B. и в принципе не проблема. но если как-то можно по другому, то хотелось бы посмотреть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 09:12 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
есть такая вещь - список инициализации Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 09:43 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
кажется то что надо. спасибо. как много я еще не знаю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 10:20 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
funikovyuriесть такая вещь - список инициализации Парметр this (а как раз это надо, судя по первому сообщению) не рекомендуется использовать в списке инициализации. Хотя и не все компилеры выдают соотв. предупреждение. Вот несколько надуманный, но не невероятный пример неприятных последствий. (а реально зависимости будут другими и менее очевидными) Дизайн коряв, и за такой код руки отрывать, конеш, но код компилируемый, а фантазии разработчиков бывают иногда и более извращенными :) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 10:36 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
redskin Парметр this (а как раз это надо, судя по первому сообщению) не рекомендуется использовать в списке инициализации. Полностью согласен. Объяснение этому очень простое - агрегированные объекты и базовые классы создаются раньше чем класс-потомок и передача им указателя this на самом деле означает передачу адреса еще не инициализированного объекта... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 13:14 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
но если я просто сохраню this в переменной это будет нормально? хотя в принципе угрозу понял. надо подумать еще, короче ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 14:17 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
alex_kно если я просто сохраню this в переменной это будет нормально? Совет дня типа...Если не знаете как сделать инструкциями языка тот или иной функционал - вспомните, что C++ это попытка формализации ОО. А ОО - это в общем-то жизнь... Или по другому... Не корректно копаться в потрохах того, чего Вы не знаете (создано позже). Корректней сделать глагол и сказать - эй, кто там позже сделан - мне нужно твоё имя (к примеру). Сие можно (например) реализовать с помощью виртуальных методов. с уважением (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 15:11 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Если ты хочешь избежать передачи указателя на неинициализированный объект, рассмотри возможность передачи в конструктор агрегируемогого объекта указателя на базовый класс. Например, если есть некая конструкция типа Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 15:14 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
2Бармалей Код: plaintext 1. 2. 3. 4. 5. 6. а кто создает m_a? что-то я недогоняю. Ведь это просто указатель. На что он будет указывать при создании m_b? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 15:30 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Бармолей Не смешно... от того что вы передаете указатель на базовый класс ситуация только ухудшается - ведь класс так и не был создан до конца, а вы его кому-то передаете. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 15:31 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Имеется ввиду что где то, ну в винмейн там или где угодно, есть код создания объекта класса AExt, например: Код: plaintext 1. 1) A() 2) B() 3) AExt() На этом и предлагается сыграть - что конструктор A уже отработал к моменту вызова конструктора B. Ситуация вовсе не ухудшается, если только агрегируемому объекту B достаточно иметь доступ к базовому классу а не к финальному. Поэтому я и написал - рассмотри возможность такой организации. Поясняю. В строке Код: plaintext 1. funikovyuri Ожидаю что строка Код: plaintext 1. ЗЫ Очепятка: нужно конечно вместо %s писать %d\n ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 16:15 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Угу пример не удачный, пусть будет так Код: 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. Идея в том, что у конструктра есть задача - перевести вновь созданный объект в некоторое начальное непротиворечивое состояние. Так вот с этой точки зрения передача указателя на объект у которого отработала только часть конструкторов - это только способ запутать логику работы коды... То что память там будет валидная - это и без базового конструктора будет верно так как выделение ее уже произошло ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 16:42 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
А что показывает второй пример? Можно еще хоть 100 раз после инициализации m_b указателем на A* поменять значение m_x и m_b, если его не дернуть, ничего не напечатает, что и следовало ожидать. Идея в том, что у конструктра есть задача - перевести вновь созданный объект в некоторое начальное непротиворечивое состояние Ну да. Оно и выходит непротеворечивым. Так вот с этой точки зрения передача указателя на объект у которого отработала только часть конструкторов - это только способ запутать логику работы коды... Субъективная оценка. Не, это способ ее добиться того, что все передаваемые указатели указывют на валидно сформированные объекты с отработанными конструкторами. Вглядитесь в код и сравни с тем что ты говоришь, и увидишь, что слова твои неточны. Мы не передаем указатель на объект у которого отработала часть конструкторов. Мы передаем указатель не на AExt а на A, то есть на объект у которого все конструкторы отработали. A* и AExt*. Почувствуй разницу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 18:08 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
давно таких интересных тем небыло, аж душа радуется :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 18:12 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Мы передаем указатель не на AExt а на A, то есть на объект у которого все конструкторы отработали. A* и AExt*. Почувствуй разницу. А что, от того что ты объект типа AExt привел к указателю A* он вдруг стал объектом типа A у которого отработали все конструкторы? Интересное понимание полиморфизма ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 18:20 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
funikovyuriМы передаем указатель не на AExt а на A, то есть на объект у которого все конструкторы отработали. A* и AExt*. Почувствуй разницу. А что, от того что ты объект типа AExt привел к указателю A* он вдруг стал объектом типа A у которого отработали все конструкторы? Интересное понимание полиморфизма ;) Ну и дела. Понимаешь какая штука-то. Существует определенная последовательность вызова конструкторов. Сперва вызывается конструктор базового класса. Это сначала. В первую очередь (1). А потом конструкторы агрегированных объектов. Уже потом, понимаешь? Уже когда конструктор объекта A отработал. Это во вторую очередь (2). На шаге номер 2. И уже в самом конце вызывается конструктор класса AExt. Шаг 3 (3). Вникаешь? Не оттого, что мы сделали приведение типов приключилось то, что конструктор A уже отработал. А потому, что A - базовый класс. Это важно. Прежде чем веселиться стоит об этом подумать. Вот оно как оказывается. Последовательность 1-2-3, см. выше. Эвона как. И никаких абсурдов, которые ты присочинил и над которыми улыбаешься не произошло. AExt не стал объектом A, мы просто передали агрегируемому классу ссылку не на AExt, а на A. Он то остался классом AExt, но мы то передали ссылку на A. А у A и его предков конструкторы все отработали, когда мы эту ссылку передавали. Хотя у AExt конструктор конечно же не отработал еще, т.к. он идет на шаге 3, а объект типа B конструируется на шаге 2. Надеюсь, теперь понятнее, если нет - пардоньте :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 19:04 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
Бармолей Существует определенная последовательность вызова конструкторов. Я в курсе. И никаких абсурдов, которые ты присочинил и над которыми улыбаешься не произошло. Агрегированному конструктору можно передавать что-угодно, только объект ты создал типа AExt и его инициализация завершится только после того как отработает (кроме прочих) и его конструктор(AExt::AExt())... Не стоит думать о роли конструктора базового класса как о чем-то изолированном. Это уже не объект типа A - а нечто новое, в котором поведение базового конструктора может быть дополнено/переопределено в конструкторе производного класса. Последовательность вызова конструкторов строго определена и не может меняться - т.е. объект класса AExt будут в начальном состояние только после выполнения всей цепочки конструкторов, а не в ее середине. Кстати - как ты думаешь - зачем нужны виртуальные функции? Ведь по твоей логике если передал в агрегированный объект указатель на базывый класс достаточно чтобы вызывалась логика только базового класса :) PS> ты зря пытаешься найти у меня пробелы в таких вещах как последовательность вызова конструкторов - лучше постарайся понять о чем я тебе пытаюсь рассказать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 19:21 |
|
||
|
хитрое создание объектов в объекте
|
|||
|---|---|---|---|
|
#18+
funikovyuriКстати - как ты думаешь - зачем нужны виртуальные функции? Ведь по твоей логике если передал в агрегированный объект указатель на базывый класс достаточно чтобы вызывалась логика только базового класса :) экзаменатор чтоли? ты прочти что написано, командир. я говорил Алексу_К : я рассмотри возможность передачи в конструктор агрегируемогого объекта указателя на базовый класс Рассмотреть возможность - это значит обдумать, подходит ли в его случае решение. ЗЫ Твои пробелы или их отсутствие мне по барабану, я рассказывал Алексу_К возможный вариант решения, а ты чего-то о себе всё... Все ништяк, ты кульный чувак, нет у тебя пробелов, не переживай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.01.2006, 20:30 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33483536&tid=2032122]: |
0ms |
get settings: |
9ms |
get forum list: |
23ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
179ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 529ms |

| 0 / 0 |
