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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
#1

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

03.09.2011, 09:30. Просмотров 2163. Ответов 41
Метки нет (Все метки)

Мое почтение, уважаемые!
Подскажите, пожалуйста, как вызвать конструктор для 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
}
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2011, 09:30     Вызов конструктора для this в констукторе копирования
Посмотрите здесь:
C++ Неявный вызов конструктора копирования
Вызов конструктора копирования, сохранение данных C++
C++ В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?
C++ Реализация конструктора копирования для класса
C++ Определение конструктора копирования для производного класса
Используйте объект orange типа Tfruit для инициализации объекта grapefruit с помощью конструктора копирования C++
C++ Касательно конструктора копирования
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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
Форумчанин
Эксперт С++
4514 / 2856 / 228
Регистрация: 12.12.2009
Сообщений: 7,251
Записей в блоге: 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()?
Kastaneda
03.09.2011, 18:11
  #20

Не по теме:

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

Сыроежка
Заблокирован
03.09.2011, 21:18     Вызов конструктора для this в констукторе копирования #21
Цитата Сообщение от Trydorg Посмотреть сообщение
Чтобы убрать мусор из полей и затем вызвать в цикле метод вставки элементов в новый объект из копируемого.
Или будет более осмысленно повторить код из конструктора, как рекомендуют в случае с Delegating constructors?
Пустые хлопоты! На то и существуют констуркторы в том числе и конструктор копирования, чтобы инициализировать свои члены.
А ежели следовать вашей логике, то перед использованием List(), нужно также запускать Lisn(), чтобы, как вы пишите, "убрать мусор". И так будет до бесконечности!
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 21:39  [ТС]     Вызов конструктора для this в констукторе копирования #22
Но если я повторяю обнуление полей в конструкторе копирования, зачем мне переписывать код из базового конструктора, если можно просто использовать сам базовый конструктор? Никакой бесконечности я тут не вижу. В конструкторе копирования создается новый объект, вполне логично для его инициализации использовать базовый конструктор, а уже потом делать копирование.
Сыроежка
Заблокирован
03.09.2011, 21:43     Вызов конструктора для this в констукторе копирования #23
Цитата Сообщение от Trydorg Посмотреть сообщение
Но если я повторяю обнуление полей в конструкторе копирования, зачем мне переписывать код из базового конструктора, если можно просто использовать сам базовый конструктор? Никакой бесконечности я тут не вижу. В конструкторе копирования создается новый объект, вполне логично для его инициализации использовать базовый конструктор, а уже потом делать копирование.
Я не совсем понимаю, что вы имеете в виду под выражением "базовы1 конструктор"?! Это конструктор базового класса?
Конструктор копиронвания потому и называется конструктором копирования, что он должен из одного обхекта копировать данные в другой объект. Так что смысла в вашем вызове конструктора List() никакого нет!
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 21:49  [ТС]     Вызов конструктора для this в констукторе копирования #24
Базовый конструктор - это обычный конструктор (не копирования).
Мой метод вставки элементов в объект не работает с неинициализированным объектом, а я его применяю в конструкторе копирования. Поэтому приходится вызывать конструктор в конструкторе копирования.
Сыроежка
Заблокирован
03.09.2011, 21:55     Вызов конструктора для this в констукторе копирования #25
Цитата Сообщение от Trydorg Посмотреть сообщение
Базовый конструктор - это обычный конструктор (не копирования).
Мой метод вставки элементов в объект не работает с неинициализированным объектом, а я его применяю в конструкторе копирования. Поэтому приходится вызывать конструктор в конструкторе копирования.
Если у вас что-то не работает, значит вы пишите неправильный код либо с точки зрения семантики С++, либо с точки зрения логики. Следуя за вашими рассуждениями, я думаю, что вы жопускаете логическую ошибку. Так как я не понимаю разницы между тем, что вы копируете не инициализированный объект (а каким конструктором он создавался?!), и что вы внутри конструктора копирования запускаете конструктор, который создает не инициализированные объекты!
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 23:04  [ТС]     Вызов конструктора для this в констукторе копирования #26
Я делаю следующим образом:
C++
1
2
3
4
5
6
7
8
9
10
template<class Data> List<Data>::List(const List& list)
{
    new(this) List();
    Node<Data>* temp = list.pHead;
    while(temp)
    {
        this->InsertBack(temp->GetData());
        temp = temp->Next();
    }
}
Двусвязный список. Если неправ, буду рад услышать рекомендации по исправлению.
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.09.2011, 23:30     Вызов конструктора для this в констукторе копирования #27
Trydorg, приведите код конструктора по умолчанию и список полей.
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 23:47  [ТС]     Вызов конструктора для this в констукторе копирования #28
CyBOSSeR, прошу.
Поля:
C++
1
2
    Node<Data>* pHead;
    Node<Data>* pTail;
Констуктор:
C++
1
2
3
4
5
template<class Data> List<Data>::List()
{
    pHead = NULL;
    pTail = NULL;
}
CyBOSSeR
Эксперт C++
2300 / 1670 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 00:04     Вызов конструктора для this в констукторе копирования #29
Trydorg, не стоит использовать inplace new для вызова контруктора копирования, это точно никто не оценит. Лучше просто проинициализируйте нулем указатели в списке ининциализации:
C++
1
2
3
4
5
6
7
8
9
10
template<class Data> List<Data>::List(const List& list)
: pHead(0), pTail(0)
{
* * * * Node<Data>* temp = list.pHead;
* * * * while(temp)
* * * * {
* * * * * * * * this->InsertBack(temp->GetData());
* * * * * * * * temp = temp->Next();
* * * * }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 07:48     Вызов конструктора для this в констукторе копирования
Еще ссылки по теме:
C++ Грамотное использование конструктора копирования
C++ Ошибка в перегрузке конструктора копирования
Не понятна работа конструктора копирования C++
C++ По поводу ссылок и конструктора копирования

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 07:48     Вызов конструктора для this в констукторе копирования #30
Метод InsertBack создаёт копии узлов или просто вставляет заданный указатель?
Yandex
Объявления
04.09.2011, 07:48     Вызов конструктора для this в констукторе копирования
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru