![]() |
|
Модераторы: bsa |
![]()
|
|
| Хоббит |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Допустим есть класс.
И второй, класс у которого есть поле типа Cls1
В этом случае объект cls1 создастся в момент создания объекта Cls2, так как Cls1 имеет конструктор по умолчанию. Как быть если Cls1 не имеет пустого конструктора, а только конструктор с параметрами, более того, параметр определяется в конструкторе Cls2
И второй, класс у которого есть поле типа Cls1
Такой код даже не скомпилируется. Какой есть выход? Я так понимаю можно сделать поле cls1 типа Cls1*. И в конструкторе создать объект через new, но его тогда надо будет потом удалить... иначе утечка памяти. А чтобы его корректно удалить, надо заводить конструктор копий для этого объекта счетчик ссылок. Или использовать безопасные указатели, что тоже не хотелось бы. |
||||||||
|
|||||||||
| Fazil6 |
|
||||||||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
Слышал когда-нибудь про список инициализации?
деструктор Cls2 для чего тебе дан?
Конструктор копии тут пишется за 1 минуту, а счетчик ссылок нужен только если объект cls1 разделяемый , в чем я сильно сомневаюсь. И даже в этом случае проблемы никакой нет. Это сообщение отредактировал(а) Fazil6 - 6.1.2009, 15:39 |
||||||||
|
|||||||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Я к тому что если в программе сделать так
То при запуске метода cls2 с копируется, а при завершении метода для копии вызовется деструктор, который очистит память по указателю. После завершения программы для основного объекта опять вызовется деструктор и будет попытка очистить память второй раз. Про список инициализации сейчас прочитаю. |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 7 Всего: 60 |
ну так на то и пишется коструктор копии, чтобы не указатель копировался, а объект |
|||
|
||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Я так понял, список инициализации поможет, если параметры конструктора cls1 определены в прототипе конструктора Cls2, что то вроде
А что делать, если параметр инициализации, определяется только внутри конструктора Cls2. Второй вариант с указателями? Добавлено через 1 минуту и 9 секунд Fazil6 ... а если у меня указатель на объект вроде MYSQL_RES, как его скопировать? |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если храните указатель на некопируемый объект, то 1. либо объект хозяин Вы должен сделать не копируемым 2. либо реализовать сов;местное пользование этим ресурсом (подсчет ссылок)
приведите пример чего хотите (инициализировать в списке параметров можно к примеру результатом (статической) функции) |
|||
|
||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Пример
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
так пример нужен не того как написать класс (как я понял в этом то и вопрос), а вычисления какого типа необходимы. Ну вот так можно :
|
|||
|
||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Ясно. Мне этого достаточно. Всем спасибо.
Это сообщение отредактировал(а) Хоббит - 7.1.2009, 08:57 |
|||
|
||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
А можно делать вот так?
|
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 2 Всего: 9 |
...и потом вылетаем по ошибке защиты памяти на ближайшей строке... нет, нельзя. cls1 здесь будет локальной переменной, видимой только в конструкторе(про время жизни стековых переменных слышал?). Соответственно, если ты попытаешься "достучатся" до этой переменной откуда-нибудь еще, она уже прекратит свое существование и ОС прихлопнет программу. Все. |
|||
|
||||
| Хоббит |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1263 Регистрация: 6.11.2005 Репутация: нет Всего: 1 |
Тогда создать ссылку на копию и удалить указатель, когда он не нужен будет?
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
*создать динамический(в куче) объект и присвоить его указателю, и удалить (объект, а не указатель) когда он будет не нужен. если у Вас определен конструктор копирования, то можно. Хотя, показанное в Вашем примере, является излишeством - но предполагаю Вы просто сильно упростили для примера. Это сообщение отредактировал(а) mes - 10.1.2009, 13:27 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |