![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mrgloom |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
вообщем есть аналог std::vector для произвольного класса(темлейтный)
код который увеличивает размер массива и копирует содержимое старого массива в больший новый
тут всё нормально но теперь представим, что у нас есть класс с указателем типа
так вот на delete[] m_pData; вызывается деструктор CMyClass и удаляется то что по указателю pi, а потом уже получается не валидный указатель копируется. в std:: vector делается как то подругому? как решить проблему? убрать всё из деструктора и удалять память по указателю pi явно в программе? |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
mrgloom, нет. Необходимо создать свои оператор присваивания и конструктор копирования.
|
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
ага.
прочитал это http://www.cplusplus.com/articles/y8hv0pDG/ но логически не понял про const
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
mrgloom, когда ты создаешь временный объект вызовом конструктора: CMyClass(); то его нельзя менять. Поэтому конструктор MyClass(MyClass &other) для этого не подходит. А вот MyClass(const MyClass &other) успешно примет такой объект.
Поэтому сигнатура конструктора копирования должна быть: CMyClass(const CMyClass &other); Сигнатура оператора присваивания должна быть: MyClass& operator=(const MyClass &other); Возможны варианты, но в этом случае ты должен ТОЧНО ЗНАТЬ ЧТО И ЗАЧЕМ ТЫ ДЕЛАЕШЬ. |
|||
|
||||
mrgloom |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 829 Регистрация: 8.6.2011 Репутация: нет Всего: нет |
так где я его меняю? я же просто присваиваю, т.е. использую только справа.
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
mrgloom, тут не вопрос в том, меняешь ли ты его или нет. Компилятор должен быть заранее уверен в том, что ты его не изменишь. Вот для этого const и существует. Более того, практика его игнорирования очень порочна и приводит к серьезным последствиям в больших проектах (хотя, те кто не использует const до больших проектов редко "доживают").
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |