Форум программистов, компьютерный форум CyberForum.ru

Вызов конструктора для this в констукторе копирования - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 09:30     Вызов конструктора для this в констукторе копирования #1
Мое почтение, уважаемые!
Подскажите, пожалуйста, как вызвать конструктор для this в констукторе копирования:
C++
1
2
3
4
5
template<class Data> List<Data>::List(const List& list)
{
    List(); //why do not working for this?
    this->List(); //error C2273: 'function-style cast' : illegal as right side of '->' operator
}
Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 10:12     Вызов конструктора для this в констукторе копирования #2
В строке 3 создаётся объект, который удаляется после строки 3.
В конструкторе копирования должно выполняться копирование.
LosAngeles
Заблокирован
03.09.2011, 12:17     Вызов конструктора для this в констукторе копирования #3
ты наверно хочешь чтобы внутри одного конструктора вызывался другой? тогда смотри в сторону делегерующих конструкторов или как там правильно
http://www2.research.att.com/~bs/C++...elegating-ctor
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.09.2011, 12:23     Вызов конструктора для this в констукторе копирования #4
C++
1
2
3
4
template<class Data> List<Data>::List(const List& list)
{
        new(this) List(list);
}
оно?
LosAngeles
Заблокирован
03.09.2011, 12:25     Вызов конструктора для this в констукторе копирования #5
это рекурсия или мне кажется?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.09.2011, 12:28     Вызов конструктора для this в констукторе копирования #6
LosAngeles, почему? Это хитрый вызов конструктора для участка памяти по адресу this

Не по теме:

При чем этот финт я увидел в твоем же посте (если не ошибаюсь там речь шла об операторе = и пример кода был взят из стандарта С++)

LosAngeles
Заблокирован
03.09.2011, 12:30     Вызов конструктора для this в констукторе копирования #7
может я не выспался и туплю, но ты же вызываешь КК в КК?
Kastaneda
03.09.2011, 12:30
  #8

Не по теме:

вот же

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 12:31     Вызов конструктора для this в констукторе копирования #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это хитрый вызов конструктора
Это хитрый вызов конструктора копирования из конструктора копирования...
Kastaneda
03.09.2011, 12:32
  #10

Не по теме:

Цитата Сообщение от LosAngeles Посмотреть сообщение
может я не выспался и туплю, но ты же вызываешь КК в КК?
Не, похоже я не выспался и туплю)

LosAngeles
Заблокирован
03.09.2011, 12:32     Вызов конструктора для this в констукторе копирования #11
ну это всё понятно, ладно пойду проверю, меня не покидает ощущение, что тут рекурсия
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 12:39     Вызов конструктора для this в констукторе копирования #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
вот же
И в теме написал, а тут прям процитирую Саттера:
Никогда не пользуйтесь трюком реализации копирующего присваивания посредством конструирования с использованием непосредственного вызова деструктора и размещающего new...
Там ещё и Александреску участвовал, а уж этой парочке лучше верить.)

Добавлено через 1 минуту
Цитата Сообщение от LosAngeles Посмотреть сообщение
меня не покидает ощущение, что тут рекурсия
По ссылке обсуждение оператора присваивания, а он не конструктор копирования. А тут рекурсия.
LosAngeles
Заблокирован
03.09.2011, 13:04     Вызов конструктора для this в констукторе копирования #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
И в теме написал, а тут прям процитирую Саттера:
а там написано почему?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 13:39     Вызов конструктора для this в констукторе копирования #14
Цитата Сообщение от LosAngeles Посмотреть сообщение
а там написано почему?
Открытым текстом нет. Но т.к. контекст идёт о бессбойной работе, то речь о транзакциях. Т.е. В случае ошибки копирования исходный объект остаётся в актуальном состоянии (если присваивание реализовано через Swap). В данном же случае объект разрушается и в случае возможной ошибки невозможно восстановить его состояние. Как-то так.
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 17:40  [ТС]     Вызов конструктора для this в констукторе копирования #15
Спасибо за ответы, господа!

Deviaphan, я хочу вызвать базовый конструктор для инициализации полей вновь создаваемого объекта перед копированием в него другого объекта.
Подскажите, а в моем случае используется "трюк реализации копирующего присваивания посредством конструирования с использованием непосредственного вызова деструктора и размещающего new"?

LosAngeles, Delegating constructors, я так понимаю, заключается ныне в "repeat yourself or call "an init() function"". Но в светлом будущем C++0x "we can define one constructor in terms of another".

Kastaneda, ага
C++
1
new(this) List();
спасибо.
Это и есть placement new?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 17:46     Вызов конструктора для this в констукторе копирования #16
Цитата Сообщение от Trydorg Посмотреть сообщение
я хочу вызвать базовый конструктор для инициализации полей вновь создаваемого объекта перед копированием в него другого объекта
Ну ты ведь понимаешь бессмысленность этого действия? Зачем инициализировать по умолчанию и сразу же изменять значения на копируемые?
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 17:57  [ТС]     Вызов конструктора для this в констукторе копирования #17
Чтобы убрать мусор из полей и затем вызвать в цикле метод вставки элементов в новый объект из копируемого.
Или будет более осмысленно повторить код из конструктора, как рекомендуют в случае с Delegating constructors?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
03.09.2011, 18:00     Вызов конструктора для this в констукторе копирования #18
Цитата Сообщение от Trydorg Посмотреть сообщение
Kastaneda, ага
C++
1
new(this) List();
спасибо.
Не делай так! Это я тупанул, тут получается вызов копирующего конструктора в копирующем конструкторе, т.е. рекурсия, которую допускать нельзя!
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 18:06  [ТС]     Вызов конструктора для this в констукторе копирования #19
Kastaneda, я прошелся по дебагу - все отлично, ничего лишнего.
Так что, все-таки делать метод init()?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 18:11     Вызов конструктора для this в констукторе копирования
Еще ссылки по теме:

C++ Определение конструктора копирования для производного класса
C++ Подскажите реализацию конструктора копирования

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kastaneda
03.09.2011, 18:11     Вызов конструктора для this в констукторе копирования
  #20

Не по теме:

Цитата Сообщение от Trydorg Посмотреть сообщение
Kastaneda, я прошелся по дебагу - все отлично, ничего лишнего.
А ну да, я на код внимания не обратил, тут же получается просто вызов конструктора. Что-то я сегодня гоню сильно

Yandex
Объявления
03.09.2011, 18:11     Вызов конструктора для this в констукторе копирования
Ответ Создать тему
Опции темы

Текущее время: 13:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru