Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/25: Рейтинг темы: голосов - 25, средняя оценка - 4.68
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25

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

03.09.2011, 09:30. Показов 5455. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2011, 09:30
Ответы с готовыми решениями:

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

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

Двойной вызов конструктора копирования при захате по значению
class LambdaMon{ public: LambdaMon() {std::cout &lt;&lt; &quot;LambdaMon&quot;&lt;&lt; std::endl;} LambdaMon(const LambdaMon&amp; lb)...

41
Заблокирован
03.09.2011, 21:18
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Trydorg Посмотреть сообщение
Чтобы убрать мусор из полей и затем вызвать в цикле метод вставки элементов в новый объект из копируемого.
Или будет более осмысленно повторить код из конструктора, как рекомендуют в случае с Delegating constructors?
Пустые хлопоты! На то и существуют констуркторы в том числе и конструктор копирования, чтобы инициализировать свои члены.
А ежели следовать вашей логике, то перед использованием List(), нужно также запускать Lisn(), чтобы, как вы пишите, "убрать мусор". И так будет до бесконечности!
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 21:39  [ТС]
Но если я повторяю обнуление полей в конструкторе копирования, зачем мне переписывать код из базового конструктора, если можно просто использовать сам базовый конструктор? Никакой бесконечности я тут не вижу. В конструкторе копирования создается новый объект, вполне логично для его инициализации использовать базовый конструктор, а уже потом делать копирование.
0
Заблокирован
03.09.2011, 21:43
Цитата Сообщение от Trydorg Посмотреть сообщение
Но если я повторяю обнуление полей в конструкторе копирования, зачем мне переписывать код из базового конструктора, если можно просто использовать сам базовый конструктор? Никакой бесконечности я тут не вижу. В конструкторе копирования создается новый объект, вполне логично для его инициализации использовать базовый конструктор, а уже потом делать копирование.
Я не совсем понимаю, что вы имеете в виду под выражением "базовы1 конструктор"?! Это конструктор базового класса?
Конструктор копиронвания потому и называется конструктором копирования, что он должен из одного обхекта копировать данные в другой объект. Так что смысла в вашем вызове конструктора List() никакого нет!
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 21:49  [ТС]
Базовый конструктор - это обычный конструктор (не копирования).
Мой метод вставки элементов в объект не работает с неинициализированным объектом, а я его применяю в конструкторе копирования. Поэтому приходится вызывать конструктор в конструкторе копирования.
0
Заблокирован
03.09.2011, 21:55
Цитата Сообщение от Trydorg Посмотреть сообщение
Базовый конструктор - это обычный конструктор (не копирования).
Мой метод вставки элементов в объект не работает с неинициализированным объектом, а я его применяю в конструкторе копирования. Поэтому приходится вызывать конструктор в конструкторе копирования.
Если у вас что-то не работает, значит вы пишите неправильный код либо с точки зрения семантики С++, либо с точки зрения логики. Следуя за вашими рассуждениями, я думаю, что вы жопускаете логическую ошибку. Так как я не понимаю разницы между тем, что вы копируете не инициализированный объект (а каким конструктором он создавался?!), и что вы внутри конструктора копирования запускаете конструктор, который создает не инициализированные объекты!
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 23:04  [ТС]
Я делаю следующим образом:
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
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
03.09.2011, 23:30
Trydorg, приведите код конструктора по умолчанию и список полей.
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 23:47  [ТС]
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
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 00:04
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
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 07:48
Метод InsertBack создаёт копии узлов или просто вставляет заданный указатель?
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
04.09.2011, 08:55  [ТС]
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
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 18:00
Цитата Сообщение от Trydorg Посмотреть сообщение
this->~List();
new(this) List();
Trydorg, где Вы видели что бы так реализовывалтся оператор копирования? Где вы вообще видели чтобы сам объект класса вызывал свой деструктор, да и inplace new?
0
Заблокирован
04.09.2011, 18:06
Цитата Сообщение от Trydorg Посмотреть сообщение
А как мне быть с перегрузкой = ?
copy constructor operator=
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
04.09.2011, 18:57  [ТС]
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
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2011, 19:01
Цитата Сообщение от Trydorg Посмотреть сообщение
CyBOSSeR, нигде не видел
В том то и дело, что нигде. Это выглядит, мягко говоря специфично, и врядли кто ли бо Вас за такой подход похвалит, скорее наоборот.
Цитата Сообщение от Trydorg Посмотреть сообщение
Нам преподаватель говорит, что нужно стремиться к минимизации повторений кусков кода, заключать повторения в методы и максимально упрощать реализации.
Что мешает завести методы типа initialize и deinitialize и вызывать их из нужных методов?
0
Делаю внезапно и красиво
Эксперт С++
 Аватар для Deviaphan
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
04.09.2011, 20:03
Цитата Сообщение от Trydorg Посмотреть сообщение
Оптимизировал перегрузку = до
Я не буду ещё раз рассказывать о неправильности реализации, лучше я расскажу о неправильности интерфейса.
Оператор присваивания не может (не должен) возвращать void. В данном случае следует возвращать List<Data>&.
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
07.09.2011, 23:35  [ТС]
Спасибо за дельные советы, господа!
Переделал согласно вашим рекомендациям.
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
Заблокирован
08.09.2011, 04:26
с точки зрения работоспобности может и верно, а вот логики - не очень. Зачем проводить инициализацию при деинициализации?
0
1 / 1 / 1
Регистрация: 23.03.2011
Сообщений: 25
08.09.2011, 08:43  [ТС]
LosAngeles, а если вы после вызова деструктора решите начать все сначала с этим объектом? Без инициалиации в деструкторе мы получаем дыру, как по-мне.
0
Заблокирован
08.09.2011, 09:05
Цитата Сообщение от 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.09.2011, 09:05

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

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

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

Реализация конструктора копирования для двумерного динамического массива
Практически реализовал, не понимаю, почему не получается... #include &lt;iostream&gt; #include &lt;time.h&gt; using namespace std; ...

Вызов конструктора из конструктора и проверка правильности передаваемых параметров
Существует такой код: public Matrix(Double array) : this(array.GetLength(0), array.GetLength(1)) { ...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru