Форум программистов, компьютерный форум 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
}
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.09.2011, 09:30     Вызов конструктора для this в констукторе копирования
Посмотрите здесь:

C++ Касательно конструктора копирования
C++ По поводу ссылок и конструктора копирования
C++ Ошибка в перегрузке конструктора копирования
C++ Определение конструктора копирования для производного класса
C++ Неявный вызов конструктора копирования
Не понятна работа конструктора копирования C++
C++ Пример конструктора копирования не понятен
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
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++
 Аватар для CyBOSSeR
2295 / 1665 / 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++
 Аватар для CyBOSSeR
2295 / 1665 / 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();
* * * * }
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 07:48     Вызов конструктора для this в констукторе копирования #30
Метод InsertBack создаёт копии узлов или просто вставляет заданный указатель?
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
04.09.2011, 08:55  [ТС]     Вызов конструктора для this в констукторе копирования #31
Deviaphan, создает новый элемент списка с конца:
C++
1
2
3
4
5
6
7
template<class Data> void List<Data>::InsertBack(Data data)
{
    if(EmptyList(data))
        return;
    pTail->Next(new Node<Data>(data, NULL, pTail));
    pTail = pTail->Next();
}
А как мне быть с перегрузкой = ?
C++
1
2
3
4
5
6
7
8
9
10
11
template<class Data> void List<Data>::operator = (const List& list)
{
    this->~List();
    new(this) List();
    Node<Data>* temp = list.pHead;
    while(temp)
    {
        InsertBack(temp->GetData());
        temp = temp->Next();
    }
}
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 18:00     Вызов конструктора для this в констукторе копирования #32
Цитата Сообщение от Trydorg Посмотреть сообщение
this->~List();
new(this) List();
Trydorg, где Вы видели что бы так реализовывалтся оператор копирования? Где вы вообще видели чтобы сам объект класса вызывал свой деструктор, да и inplace new?
LosAngeles
Заблокирован
04.09.2011, 18:06     Вызов конструктора для this в констукторе копирования #33
Цитата Сообщение от Trydorg Посмотреть сообщение
А как мне быть с перегрузкой = ?
copy constructor operator=
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
04.09.2011, 18:57  [ТС]     Вызов конструктора для this в констукторе копирования #34
LosAngeles, спасибо. Оптимизировал перегрузку = до:
C++
1
2
3
4
5
template<class Data> void List<Data>::operator = (const List& list)
{
    this->~List();
    new(this) List(list);
}

CyBOSSeR, нигде не видел. Частично сам дошел, частично здесь умные люди подсказали. А что не так? Нам преподаватель говорит, что нужно стремиться к минимизации повторений кусков кода, заключать повторения в методы и максимально упрощать реализации.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2295 / 1665 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 19:01     Вызов конструктора для this в констукторе копирования #35
Цитата Сообщение от Trydorg Посмотреть сообщение
CyBOSSeR, нигде не видел
В том то и дело, что нигде. Это выглядит, мягко говоря специфично, и врядли кто ли бо Вас за такой подход похвалит, скорее наоборот.
Цитата Сообщение от Trydorg Посмотреть сообщение
Нам преподаватель говорит, что нужно стремиться к минимизации повторений кусков кода, заключать повторения в методы и максимально упрощать реализации.
Что мешает завести методы типа initialize и deinitialize и вызывать их из нужных методов?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 20:03     Вызов конструктора для this в констукторе копирования #36
Цитата Сообщение от Trydorg Посмотреть сообщение
Оптимизировал перегрузку = до
Я не буду ещё раз рассказывать о неправильности реализации, лучше я расскажу о неправильности интерфейса.
Оператор присваивания не может (не должен) возвращать void. В данном случае следует возвращать List<Data>&.
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
07.09.2011, 23:35  [ТС]     Вызов конструктора для this в констукторе копирования #37
Спасибо за дельные советы, господа!
Переделал согласно вашим рекомендациям.
C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
template<class Data> void List<Data>::Initialization() 
{
    pHead = NULL;
    pTail = NULL;
}
 
template<class Data> void List<Data>::Deinitialization()
{
    while(pHead)
        RemoveBack();
    Initialization();
}
 
template<class Data> void List<Data>::RemoveBack()
{
    if(!pHead)
        return;
    Node<Data>* temp = pTail->Prev();
    delete pTail;
    pTail = temp;
    if(!pTail)
    {
        pHead = pTail;
        return;
    }
    pTail->Next(NULL);
}
 
template<class Data> void List<Data>::CopyProcedure(List& thisList, const List& list) 
{
    Node<Data>* temp = list.pHead;
    while(temp)
    {
        thisList.InsertBack(temp->GetData());
        temp = temp->Next();
    }
}
 
template<class Data> List<Data>::List()
{
    Initialization();
}
 
template<class Data> List<Data>::List(const List& list)
{
    Initialization();
    CopyProcedure(*this, list);
}
 
template<class Data> List<Data>::~List()
{
    Deinitialization();
}
 
template<class Data> List<Data>& List<Data>::operator = (const List& list)
{
    Deinitialization();
    CopyProcedure(*this, list);
    return *this;
}
 
template<class Data> List<Data> List<Data>::operator + (const List<Data>& list)
{
    List<Data> temp;
    CopyProcedure(temp, *this);
    CopyProcedure(temp, list);
    return temp;
}
Так правильно будет?
LosAngeles
Заблокирован
08.09.2011, 04:26     Вызов конструктора для this в констукторе копирования #38
с точки зрения работоспобности может и верно, а вот логики - не очень. Зачем проводить инициализацию при деинициализации?
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
08.09.2011, 08:43  [ТС]     Вызов конструктора для this в констукторе копирования #39
LosAngeles, а если вы после вызова деструктора решите начать все сначала с этим объектом? Без инициалиации в деструкторе мы получаем дыру, как по-мне.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2011, 09:05     Вызов конструктора для this в констукторе копирования
Еще ссылки по теме:

C++ Реализация конструктора копирования для класса
C++ В чём отличия конструктора копирования и конструктора перемещения? Где и как их нужно использовать?
Используйте объект orange типа Tfruit для инициализации объекта grapefruit с помощью конструктора копирования C++
C++ Грамотное использование конструктора копирования

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

Или воспользуйтесь поиском по форуму:
LosAngeles
Заблокирован
08.09.2011, 09:05     Вызов конструктора для this в констукторе копирования #40
Цитата Сообщение от Trydorg Посмотреть сообщение
а если вы после вызова деструктора решите начать все сначала с этим объектом?
каким образом ты хочешь работать с объектом после вызова его деструктора?

Добавлено через 2 минуты
Цитата Сообщение от Trydorg Посмотреть сообщение
template<class Data> List<Data> List<Data>::operator + (const List<Data>& list)
template<class Data> List<Data> const List<Data>::operator + (const List<Data>& list)
наверно должно быть так, иначе такие записи прокатят
if ( firstList + secondList = thirdList )

Добавлено через 1 минуту
Цитата Сообщение от Trydorg Посмотреть сообщение
operator =
нет проверки на самоприсваивание
Yandex
Объявления
08.09.2011, 09:05     Вызов конструктора для this в констукторе копирования
Ответ Создать тему
Опции темы

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