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

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

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

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

03.09.2011, 09:30. Просмотров 2173. Ответов 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 с помощью...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
04.09.2011, 08:55  [ТС] #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();
    }
}
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 18:00 #32
Цитата Сообщение от Trydorg Посмотреть сообщение
this->~List();
new(this) List();
Trydorg, где Вы видели что бы так реализовывалтся оператор копирования? Где вы вообще видели чтобы сам объект класса вызывал свой деструктор, да и inplace new?
0
LosAngeles
Заблокирован
04.09.2011, 18:06 #33
Цитата Сообщение от Trydorg Посмотреть сообщение
А как мне быть с перегрузкой = ?
copy constructor operator=
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
04.09.2011, 18:57  [ТС] #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, нигде не видел. Частично сам дошел, частично здесь умные люди подсказали. А что не так? Нам преподаватель говорит, что нужно стремиться к минимизации повторений кусков кода, заключать повторения в методы и максимально упрощать реализации.
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 19:01 #35
Цитата Сообщение от Trydorg Посмотреть сообщение
CyBOSSeR, нигде не видел
В том то и дело, что нигде. Это выглядит, мягко говоря специфично, и врядли кто ли бо Вас за такой подход похвалит, скорее наоборот.
Цитата Сообщение от Trydorg Посмотреть сообщение
Нам преподаватель говорит, что нужно стремиться к минимизации повторений кусков кода, заключать повторения в методы и максимально упрощать реализации.
Что мешает завести методы типа initialize и deinitialize и вызывать их из нужных методов?
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 20:03 #36
Цитата Сообщение от Trydorg Посмотреть сообщение
Оптимизировал перегрузку = до
Я не буду ещё раз рассказывать о неправильности реализации, лучше я расскажу о неправильности интерфейса.
Оператор присваивания не может (не должен) возвращать void. В данном случае следует возвращать List<Data>&.
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
07.09.2011, 23:35  [ТС] #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;
}
Так правильно будет?
0
LosAngeles
Заблокирован
08.09.2011, 04:26 #38
с точки зрения работоспобности может и верно, а вот логики - не очень. Зачем проводить инициализацию при деинициализации?
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
08.09.2011, 08:43  [ТС] #39
LosAngeles, а если вы после вызова деструктора решите начать все сначала с этим объектом? Без инициалиации в деструкторе мы получаем дыру, как по-мне.
0
LosAngeles
Заблокирован
08.09.2011, 09:05 #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 =
нет проверки на самоприсваивание
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
08.09.2011, 12:50 #41
Цитата Сообщение от Trydorg Посмотреть сообщение
LosAngeles, а если вы после вызова деструктора решите начать все сначала с этим объектом?
После вызова деструктора объекта больше нет, он умер. Вы хотите работать с зомби? Если решите "начать все сначала" - создайте новый объект.
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
08.09.2011, 19:16  [ТС] #42
Спасибо за дельные советы и подсказки!

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

LosAngeles, спасибо, исправил.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
template<class Data> const List<Data> List<Data>::operator + (const List<Data>& list)
{
    List<Data> temp;
    CopyProcedure(temp, *this);
    CopyProcedure(temp, list);
    return temp;
}
 
template<class Data> List<Data>& List<Data>::operator = (const List& list)
{
    if(this != &list) //проверка на присвоение самому себе
    {
        Deinitialization();
        CopyProcedure(*this, list);
    }
    return *this;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.09.2011, 19:16
Привет! Вот еще темы с ответами:

Касательно конструктора копирования - 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){ ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.09.2011, 19:16
Ответ Создать тему
Опции темы

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