8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
||||||||||||||||
1 | ||||||||||||||||
Почему допустимо создавать объект по другому объекту, но нельзя присваивать уже созданный объект, другому созданному объекту?18.01.2013, 00:05. Показов 1993. Ответов 22
Метки нет Все метки)
(
Это можно :
Вот полный код :
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
18.01.2013, 00:05 | |
Ответы с готовыми решениями:
22
Как обратиться к созданному объекту, если переменной присвоен уже другой объект? Как прикрепить линию к объекту и провести к другому объекту? Почему конструктор вызывается при присвоении объекта другому объекту
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
18.01.2013, 00:08 | 2 |
Потому что как только вы объявляете свой конструктор, стандартная копировалка убирается. Чтобы определить свою, определяйте метод Array& Array::operator=(const Array &other), который и выполнит копирование полей из объекта other в текущий (и вернёт этот же текущий, return *this;).
1
|
100 / 100 / 47
Регистрация: 19.11.2012
Сообщений: 195
|
||||||
18.01.2013, 00:14 | 3 | |||||
А у меня и без стандартного работает, в а установили в б получили:
1
|
~ Эврика! ~
1256 / 1005 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
|
|
18.01.2013, 01:10 | 4 |
Ага, но только mydata у них общий. Умрёт один объект и отберёт у второго данные. А по-хорошему объект должен снять копию со всего массива. Ну или обеспечить его неудаление, пока на него кто-то ссылается.
1
|
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
|||||||||||
18.01.2013, 01:53 [ТС] | 6 | ||||||||||
Всем спасибо! С конструктором копий и выделением под него нового массива, что бы деструктор первого объекта не удалил его, разобрался. Но вот не понял как он себя вызывает бесконечно, если в его объявлении указать не ссылку на объект, а просто объект, то есть не
Можете на пальцах объяснить порядок действий или почему так происходит?
0
|
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
|
18.01.2013, 18:33 [ТС] | 8 |
Jupiter. То есть он будет восприниматься как ещё один конструктор, а не конструктор копирования и он будет выполнятся после первого конструктора, потому что количество конструкторов неограниченно, если у них разные параметры. А как конструктор получит объект на втором проходе(когда сам себя будет вызывать)? Почитав о рекурсии, все ровно не до конца понимаю как это будет выглядеть на примере с объектом.
Если вам не сложно, то могли бы вы привести какой-то схематический пример как это выглядит в памяти, что копируется, куда и зачем или на словах описать поподробней?
0
|
Форумчанин
![]() ![]() 8193 / 5043 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
|
||||||
18.01.2013, 19:02 | 10 | |||||
Убирается лишь конструктор по-умолчанию при явном указании хотя бы одного. Иначе данный код не компилился бы:
0
|
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
|
19.01.2013, 00:17 [ТС] | 11 |
Переменные, в которых сохраняются параметры, передаваемые функции, также являются локальными для этой функции. Эти переменные создаются при вызове функции и в них копируются значения, передаваемые функции в качестве параметров.
С обычными переменными понятно. А вот что копируется из одного объекта в другой так, что при этом вызывается ещё одно копирование, не понятно. Допустим значение должно копироваться в параметр Array(Array a) , то есть это равносильно тому, если в main будет b=a , а потом получается что при копировании объекта "a" в объект "b", объект b дойдет до этого же конструктора Array(Array a) и снова запустить копирование b=a. Даже если это так, то я не понимаю как это выглядит за ширмой, то есть на этапе компиляции, когда уже нету классов. И как по мне, то далеко не уехать, с таким пониманием данного вопроса, по этому и спрашиваю.
0
|
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
|
19.01.2013, 01:04 [ТС] | 13 |
Kuzia domovenok, из-за чего тогда происходит бесконечный вызов?
P.S. Я может быть задаю глупые вопросы, но в моем понимании не хватает какой-то детали, которую возможно вы все здесь считают очевидной и не нужной для объяснения. По этому и прошу максимально подробно описать что происходит в момент копировании и почему это заставляет повторно вызывать копирование.
0
|
19.01.2013, 01:14 | 14 | |||||
во-первых, есть разница между присвоением и конструированием копии. Похоже, ты до сих пор не уловил это и говоришь не о том, о чём тебе говорят
1
|
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
|
19.01.2013, 02:34 [ТС] | 15 |
Kuzia domovenok, ясно, спасибо за уточнение, но это не дает ответа на мой вопрос. Почему конструктор вызывается бесконечно, если в его параметр передать объект по значению, то есть не по ссылке Array(Array &a), а по значению Array(Array a). Не важно, что это не работает. Меня интересует как это устроено и за счет чего идет бесконечный вызов, а то я встречал только упоминания о нем, а развернутого ответа не нашел, возможно он очевиден, но я его не могу понять. Ещё раз подчеркиваю, мне важно понять как это устроено, а не просто оставить это на поверхностном уровне понимания.
0
|
Каратель
![]() |
|
19.01.2013, 02:37 | 16 |
все что передается по значению копируется,
копии объектов классов конструируются конструктором копирования, потому если конструктор копирования принимал бы параметр по значению то и возникла бы бесконечная рекурсия
1
|
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
|
19.01.2013, 02:46 [ТС] | 17 |
Jupiter, а как бы тогда выглядела реализация такого такого конструктора копирования?
0
|
Каратель
![]() |
||||||
19.01.2013, 02:51 | 18 | |||||
1
|
8 / 8 / 2
Регистрация: 14.01.2013
Сообщений: 141
|
|
19.01.2013, 03:16 [ТС] | 19 |
Jupiter, спасибо! Хотелось бы уточнить ещё один момент.
То есть до исполнения тела конструктора копий так и не дойдет?
0
|
Каратель
![]() |
|
19.01.2013, 04:03 | 20 |
1
|
19.01.2013, 04:03 | |
Помогаю со студенческими работами здесь
20
Привязать элемент к другому объекту Движение объекта к другому объекту Передача объектов в качестве параметров другому объекту Как сделать перемещение объекта к другому объекту Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |