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

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

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

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

03.09.2011, 09:30. Просмотров 2219. Ответов 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
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 10:12 #2
В строке 3 создаётся объект, который удаляется после строки 3.
В конструкторе копирования должно выполняться копирование.
0
LosAngeles
Заблокирован
03.09.2011, 12:17 #3
ты наверно хочешь чтобы внутри одного конструктора вызывался другой? тогда смотри в сторону делегерующих конструкторов или как там правильно
http://www2.research.att.com/~bs/C++0xFAQ.html#delegating-ctor
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
03.09.2011, 12:23 #4
C++
1
2
3
4
template<class Data> List<Data>::List(const List& list)
{
        new(this) List(list);
}
оно?
0
LosAngeles
Заблокирован
03.09.2011, 12:25 #5
это рекурсия или мне кажется?
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,355
Записей в блоге: 2
Завершенные тесты: 1
03.09.2011, 12:28 #6
LosAngeles, почему? Это хитрый вызов конструктора для участка памяти по адресу this

Не по теме:

При чем этот финт я увидел в твоем же посте (если не ошибаюсь там речь шла об операторе = и пример кода был взят из стандарта С++)

0
LosAngeles
Заблокирован
03.09.2011, 12:30 #7
может я не выспался и туплю, но ты же вызываешь КК в КК?
1
Kastaneda
03.09.2011, 12:30
  #8

Не по теме:

вот же

0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 12:31 #9
Цитата Сообщение от Kastaneda Посмотреть сообщение
Это хитрый вызов конструктора
Это хитрый вызов конструктора копирования из конструктора копирования...
1
Kastaneda
03.09.2011, 12:32
  #10

Не по теме:

Цитата Сообщение от LosAngeles Посмотреть сообщение
может я не выспался и туплю, но ты же вызываешь КК в КК?
Не, похоже я не выспался и туплю)

0
LosAngeles
Заблокирован
03.09.2011, 12:32 #11
ну это всё понятно, ладно пойду проверю, меня не покидает ощущение, что тут рекурсия
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 12:39 #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
вот же
И в теме написал, а тут прям процитирую Саттера:
Никогда не пользуйтесь трюком реализации копирующего присваивания посредством конструирования с использованием непосредственного вызова деструктора и размещающего new...
Там ещё и Александреску участвовал, а уж этой парочке лучше верить.)

Добавлено через 1 минуту
Цитата Сообщение от LosAngeles Посмотреть сообщение
меня не покидает ощущение, что тут рекурсия
По ссылке обсуждение оператора присваивания, а он не конструктор копирования. А тут рекурсия.
1
LosAngeles
Заблокирован
03.09.2011, 13:04 #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
И в теме написал, а тут прям процитирую Саттера:
а там написано почему?
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
03.09.2011, 13:39 #14
Цитата Сообщение от LosAngeles Посмотреть сообщение
а там написано почему?
Открытым текстом нет. Но т.к. контекст идёт о бессбойной работе, то речь о транзакциях. Т.е. В случае ошибки копирования исходный объект остаётся в актуальном состоянии (если присваивание реализовано через Swap). В данном же случае объект разрушается и в случае возможной ошибки невозможно восстановить его состояние. Как-то так.
0
Trydorg
1 / 1 / 0
Регистрация: 23.03.2011
Сообщений: 25
03.09.2011, 17:40  [ТС] #15
Спасибо за ответы, господа!

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

LosAngeles, Delegating constructors, я так понимаю, заключается ныне в "repeat yourself or call "an init() function"". Но в светлом будущем C++0x "we can define one constructor in terms of another".

Kastaneda, ага
C++
1
new(this) List();
спасибо.
Это и есть placement new?
0
03.09.2011, 17:40
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.09.2011, 17:40
Привет! Вот еще темы с ответами:

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


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

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

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