как протестировать оператор присваивания и конструктор копирования класса? |
Здравствуйте, гость ( Вход | Регистрация )
как протестировать оператор присваивания и конструктор копирования класса? |
Litkevich Yuriy |
20.4.2010, 15:36
Сообщение
#1
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Собственно вопрос: как протестировать класс на корректность работы самописаных конструктора копирования и оператора присваивания, и на предмет их существования вообще.
Положим, что в конструкторе класса создаётся динамический объект, а в деструкторе удаляется. Если свои конструктора копирования и оператора присваивания не определять, то компилятор будет использовать побитовое копирование. При этом могут возникать коварные ситуации. Как я понимаю, связанные с двойным освобождением ресурсов. Можно ли написать код, который бы осуществлял подобный тест? |
|
|
Andrewshkovskii |
20.4.2010, 15:52
Сообщение
#2
|
Активный участник Группа: Участник Сообщений: 351 Регистрация: 27.12.2008 Пользователь №: 467 Спасибо сказали: 18 раз(а) Репутация: 1 |
http://www.devexp.ru/2010/03/o-kopirovanii-obektov-v-c/
вот тут кое-что интересное о копировании объектов и присваивании. Сообщение отредактировал Andrewshkovskii - 20.4.2010, 15:57 |
|
|
Влад |
20.4.2010, 17:16
Сообщение
#3
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Если свои конструктора копирования и оператора присваивания не определять, то компилятор будет использовать побитовое копирование. Не совсем так. Компилятор будет использовать почленное копирование. Для POD-типов он вполне может оптимизировать его до побитового, типа inline memcpy - например, MSVC++ именно так и делает. Добавлено: для тестирования корректности работы отдельных функций, к каковым как раз и относятся упомянутые, применяй юнит-тестирование. Вот одна из (легких) библиотек для юнит-тестирования: UnitTest++, http://unittest-cpp.sourceforge.net/ Или посмотри на Boost.Test: http://www.boost.org/doc/libs/1_34_0/libs/.../doc/index.html Сообщение отредактировал Влад - 20.4.2010, 17:23 |
|
|
Litkevich Yuriy |
20.4.2010, 17:41
Сообщение
#4
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
я пока примитивный тест сделал (мой класс - простенький буфер):
1) проверяем правильность копирования (идентичность копии) 2) модифицируем исходный буфер, новый не должен поменяться 3) модифицируем новый буфер, исходный не должен поменяться Если я закоментирую оператор присваивания и конструктор копирования, два последних теста не проходят (как и ожидалось). Код весь находится в функции main и выглядит примерно так: Т.е. я ограничил область видимости каждого теста фигурными скобками, и полагал, что по выходу за эти скобки, программа должна аварийно завершатся при отсутствии собственных конструктора копирования и оператора присваивания. Но программа падает почему-то после всех тестов, а не когда произойдёт выход за фигурные скобки.
|
|
|
Влад |
20.4.2010, 18:06
Сообщение
#5
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Гмм.... А можно взглянуть на код этого YBuffer1?
|
|
|
DIMEDROLL |
20.4.2010, 18:30
Сообщение
#6
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
я пока примитивный тест сделал (мой класс - простенький буфер): я бы поступил так: - Для классов которые не должны копироваться использую DISALLOW_COPY_AND_ASSIGN - Для копируемых темплейтная фукция:
Весь код проверки находится в операторе сравнения(==). Для каждого класса не надо писать свою функцию теста, просто реализовать ==. В реализации == обязательно проверять указатели на равенство. Например
|
|
|
Litkevich Yuriy |
20.4.2010, 18:52
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Гмм.... А можно взглянуть на код этого YBuffer1? можно, заодно может на косяки укажите:ybuffer1.h
ybuffer1.cpp
Для копируемых темплейтная фукция: эта шаблонная функция ничего не даст, в отсутствии самописанных конструктора копирования и оператора присваиванияВесь код проверки находится в операторе сравнения(==). про это не понял, где и как применяется
|
|
|
DIMEDROLL |
20.4.2010, 18:59
Сообщение
#8
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
Цитата Для копируемых темплейтная фукция: эта шаблонная функция ничего не даст, в отсутствии самописанных конструктора копирования и оператора присваиванияЕсли программист не пишет реализацию конструктора копирования и оператора присваивания, то он подразумевает что по вариант по умолчанию его устраивает, либо должен явно запретить копирование и присваивание макросом(как я указал) помоему это является хорошим стилем кодирования.. Цитата Весь код проверки находится в операторе сравнения(==). про это не понял, где и как применяетсяЯ имел ввиду: если operator== работает правильно, то его можно использовать в моей шаблонной функции для проверки копирования и присваивания |
|
|
Litkevich Yuriy |
20.4.2010, 19:03
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
не пишет реализацию конструктора копирования и оператора присваивания, то он подразумевает что по вариант по умолчанию его собственно, я рассматриваю, отсутствие, как частный (а может и вовсе жёсткий) случай неправильной реализации КК и ОП. Т.е. должен быть какой-то чёткий эффект если что-то сделано не верно.
|
|
|
DIMEDROLL |
20.4.2010, 19:07
Сообщение
#10
|
Участник Группа: Участник Сообщений: 165 Регистрация: 28.9.2008 Из: Киев Пользователь №: 304 Спасибо сказали: 23 раз(а) Репутация: 0 |
собственно, я рассматриваю, отсутствие, как частный (а может и вовсе жёсткий) случай неправильной реализации КК и ОП. Т.е. должен быть какой-то чёткий эффект если что-то сделано не верно. что такое КК и ОП? Цитата Т.е. должен быть какой-то чёткий эффект если что-то сделано не верно. Что-то это что? чёткий эффект это какой? |
|
|
Текстовая версия | Сейчас: 29.11.2024, 1:55 |