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

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

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

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

03.09.2011, 09:30. Просмотров 2205. Ответов 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
}
Спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2011, 09:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызов конструктора для this в констукторе копирования (C++):

Неявный вызов конструктора копирования - C++
Здравствуйте, как можно неявно вызвать конструктор копирования 3 способами? Я только 1 найти смог. #include &lt;iostream&gt; class...

Вызов конструктора копирования, сохранение данных - C++
Хочу чтобы при повторном обращении к уже использовавшемуся счету прошлые изменения сохранялись Основной код : int...

В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать? - C++
Помогите разобраться в копирующем и перемещающем конструкторах. В чём их существенное отличие и какой плюс от использования перемещающего...

Реализация конструктора копирования для класса - C++
P.S плохо с русским Этот конструктор копирования сломал мне мозг И вот что я понемаю когда мы делаем так foo objCopy(obj); ...

Определение конструктора копирования для производного класса - C++
Как написать определение конструктора копирования для производного класса, а именно копировании части базового класса из одного...

Используйте объект orange типа Tfruit для инициализации объекта grapefruit с помощью конструктора копирования - C++
Есть класс с именем Tfruit и объект orange типа Tfruit. Используйте orange для инициализации нового объекта на имя grapefruit с помощью...

41
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 17:46 #16
Цитата Сообщение от Trydorg Посмотреть сообщение
я хочу вызвать базовый конструктор для инициализации полей вновь создаваемого объекта перед копированием в него другого объекта
Ну ты ведь понимаешь бессмысленность этого действия? Зачем инициализировать по умолчанию и сразу же изменять значения на копируемые?
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 17:57  [ТС] #17
Чтобы убрать мусор из полей и затем вызвать в цикле метод вставки элементов в новый объект из копируемого.
Или будет более осмысленно повторить код из конструктора, как рекомендуют в случае с Delegating constructors?
0
Kastaneda
Нарушитель
Эксперт С++
4676 / 2880 / 234
Регистрация: 12.12.2009
Сообщений: 7,314
Записей в блоге: 2
Завершенные тесты: 1
03.09.2011, 18:00 #18
Цитата Сообщение от Trydorg Посмотреть сообщение
Kastaneda, ага
C++
1
new(this) List();
спасибо.
Не делай так! Это я тупанул, тут получается вызов копирующего конструктора в копирующем конструкторе, т.е. рекурсия, которую допускать нельзя!
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 18:06  [ТС] #19
Kastaneda, я прошелся по дебагу - все отлично, ничего лишнего.
Так что, все-таки делать метод init()?
0
Kastaneda
03.09.2011, 18:11
  #20

Не по теме:

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

0
Сыроежка
Заблокирован
03.09.2011, 21:18 #21
Цитата Сообщение от Trydorg Посмотреть сообщение
Чтобы убрать мусор из полей и затем вызвать в цикле метод вставки элементов в новый объект из копируемого.
Или будет более осмысленно повторить код из конструктора, как рекомендуют в случае с Delegating constructors?
Пустые хлопоты! На то и существуют констуркторы в том числе и конструктор копирования, чтобы инициализировать свои члены.
А ежели следовать вашей логике, то перед использованием List(), нужно также запускать Lisn(), чтобы, как вы пишите, "убрать мусор". И так будет до бесконечности!
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 21:39  [ТС] #22
Но если я повторяю обнуление полей в конструкторе копирования, зачем мне переписывать код из базового конструктора, если можно просто использовать сам базовый конструктор? Никакой бесконечности я тут не вижу. В конструкторе копирования создается новый объект, вполне логично для его инициализации использовать базовый конструктор, а уже потом делать копирование.
0
Сыроежка
Заблокирован
03.09.2011, 21:43 #23
Цитата Сообщение от Trydorg Посмотреть сообщение
Но если я повторяю обнуление полей в конструкторе копирования, зачем мне переписывать код из базового конструктора, если можно просто использовать сам базовый конструктор? Никакой бесконечности я тут не вижу. В конструкторе копирования создается новый объект, вполне логично для его инициализации использовать базовый конструктор, а уже потом делать копирование.
Я не совсем понимаю, что вы имеете в виду под выражением "базовы1 конструктор"?! Это конструктор базового класса?
Конструктор копиронвания потому и называется конструктором копирования, что он должен из одного обхекта копировать данные в другой объект. Так что смысла в вашем вызове конструктора List() никакого нет!
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 21:49  [ТС] #24
Базовый конструктор - это обычный конструктор (не копирования).
Мой метод вставки элементов в объект не работает с неинициализированным объектом, а я его применяю в конструкторе копирования. Поэтому приходится вызывать конструктор в конструкторе копирования.
0
Сыроежка
Заблокирован
03.09.2011, 21:55 #25
Цитата Сообщение от Trydorg Посмотреть сообщение
Базовый конструктор - это обычный конструктор (не копирования).
Мой метод вставки элементов в объект не работает с неинициализированным объектом, а я его применяю в конструкторе копирования. Поэтому приходится вызывать конструктор в конструкторе копирования.
Если у вас что-то не работает, значит вы пишите неправильный код либо с точки зрения семантики С++, либо с точки зрения логики. Следуя за вашими рассуждениями, я думаю, что вы жопускаете логическую ошибку. Так как я не понимаю разницы между тем, что вы копируете не инициализированный объект (а каким конструктором он создавался?!), и что вы внутри конструктора копирования запускаете конструктор, который создает не инициализированные объекты!
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 23:04  [ТС] #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();
    }
}
Двусвязный список. Если неправ, буду рад услышать рекомендации по исправлению.
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
03.09.2011, 23:30 #27
Trydorg, приведите код конструктора по умолчанию и список полей.
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 23:47  [ТС] #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;
}
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 00:04 #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();
* * * * }
}
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 07:48 #30
Метод InsertBack создаёт копии узлов или просто вставляет заданный указатель?
0
04.09.2011, 07:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.09.2011, 07:48
Привет! Вот еще темы с ответами:

Касательно конструктора копирования - C++
Вопрос следующий. У меня есть класс &quot;Точки&quot; есть класс &quot;группы&quot; и есть класс &quot;возможные группы&quot;. 3 класса. в классе &quot;группы&quot; есть...

Грамотное использование конструктора копирования - C++
Всем добрый вечер. Есть класс list(двухсвязный). Задача гласит: Сгенерировать некоторую последовательность чисел, вывести на экран, и затем...

Реализация конструктора копирования и перегрузки = - C++
#include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class Cow{ private: char name; char *...

Пример конструктора копирования не понятен - C++
Задание: есть класс, одним из пунктом является написание класса копирования. Есть такой код Phone::Phone(Phone *a){ ...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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