crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> как протестировать оператор присваивания и конструктор копирования класса?
Litkevich Yuriy
  опции профиля:
сообщение 20.4.2010, 15:36
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Собственно вопрос: как протестировать класс на корректность работы самописаных конструктора копирования и оператора присваивания, и на предмет их существования вообще.

Положим, что в конструкторе класса создаётся динамический объект, а в деструкторе удаляется.

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

При этом могут возникать коварные ситуации. Как я понимаю, связанные с двойным освобождением ресурсов.

Можно ли написать код, который бы осуществлял подобный тест?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 20.4.2010, 17:41
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я пока примитивный тест сделал (мой класс - простенький буфер):
1) проверяем правильность копирования (идентичность копии)
2) модифицируем исходный буфер, новый не должен поменяться
3) модифицируем новый буфер, исходный не должен поменяться

Если я закоментирую оператор присваивания и конструктор копирования, два последних теста не проходят (как и ожидалось).
Код весь находится в функции main и выглядит примерно так:
    // тестируем конструктор копирования
    {
        // инициализируем буфер масивом
        YBuffer1 buffer(rowBuffer, SIZE);
        YBuffer1 bufferCopy(buffer);
        // проверяем правильность копирования
        ok = true;
        for (i = 0; i < SIZE; i++){
            if (bufferCopy[i] != buffer.at(i)){
                ok = false;
            }
        }
        if (ok){
            qDebug() << "test COPY CONSTRUCTOR, coping - passed";
        }else{
            qDebug() << "test COPY CONSTRUCTOR, coping - ERROR";
        }
        const unsigned int index1 = SIZE/2;
        // модифицируем исходный, новый не должен поменяться
        char originalFirst = buffer.at(index1);
        buffer[index1] = ~buffer.at(index1);
        if (bufferCopy.at(index1) == originalFirst){
            qDebug() << "test COPY CONSTRUCTOR, modifying original - passed";
        }else{
            qDebug() << "test COPY CONSTRUCTOR, modifying original - ERROR";
        }        
        
        // модифицируем новый, исходный не должен поменяться
        const unsigned int index2 = index1/2;
        char originalSecond = buffer.at(index2);
        bufferCopy[index2] = ~bufferCopy.at(index2);
        if (buffer.at(index2) == originalSecond){
            qDebug() << "test COPY CONSTRUCTOR, modifying new - passed";
        }else{
            qDebug() << "test COPY CONSTRUCTOR, modifying new - ERROR";
        }        
    }// конец теста    
...
//ещё несколько тестов
Т.е. я ограничил область видимости каждого теста фигурными скобками, и полагал, что по выходу за эти скобки, программа должна аварийно завершатся при отсутствии собственных конструктора копирования и оператора присваивания. Но программа падает почему-то после всех тестов, а не когда произойдёт выход за фигурные скобки.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 20.4.2010, 18:30
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 20.4.2010, 17:41) *
я пока примитивный тест сделал (мой класс - простенький буфер):

я бы поступил так:
- Для классов которые не должны копироваться использую DISALLOW_COPY_AND_ASSIGN
- Для копируемых темплейтная фукция:
template<typename T>
void TestCopyAndAssign(const T & obj) {
  T copy(obj);
  assert((copy == obj) && "Testing copy failed");
  T assign;
  assign = obj;
  assert((assign == obj) && "Testing assign failed");
}

Весь код проверки находится в операторе сравнения(==). Для каждого класса не надо писать свою функцию теста, просто реализовать ==.
В реализации == обязательно проверять указатели на равенство. Например
class A {
public:
  B *b;
  //... all operators
  bool operator==(const A &obj) {
    assert((this->b != obj.b) && "Shit happened, object copying or assigning doesn't handle pointers");
    return *this->b == *obj.b;
  }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Litkevich Yuriy   как протестировать оператор присваивания и конструктор копирования класса?   20.4.2010, 15:36
- - Andrewshkovskii   http://www.devexp.ru/2010/03/o-kopirovanii-obektov...   20.4.2010, 15:52
- - Влад   Цитата(Litkevich Yuriy @ 20.4.2010, 15:36...   20.4.2010, 17:16
- - Litkevich Yuriy   я пока примитивный тест сделал (мой класс - просте...   20.4.2010, 17:41
|- - DIMEDROLL   Цитата(Litkevich Yuriy @ 20.4.2010, 17:41...   20.4.2010, 18:30
- - Влад   Гмм.... А можно взглянуть на код этого YBuffer1?   20.4.2010, 18:06
- - Litkevich Yuriy   Цитата(Влад @ 20.4.2010, 22:06) Гмм.... А...   20.4.2010, 18:52
|- - DIMEDROLL   ЦитатаЦитата(DIMEDROLL @ 20.4.2010, 22:30...   20.4.2010, 18:59
- - Litkevich Yuriy   Цитата(DIMEDROLL @ 20.4.2010, 22:59) не п...   20.4.2010, 19:03
|- - DIMEDROLL   Цитата(Litkevich Yuriy @ 20.4.2010, 19:03...   20.4.2010, 19:07
- - Влад   Я немного подправил код.... Правда, не компилирова...   20.4.2010, 19:12
- - Litkevich Yuriy   Цитата(DIMEDROLL @ 20.4.2010, 23:07) что ...   20.4.2010, 19:16
|- - DIMEDROLL   ЦитатаКонструктор Копирования и Оператор Присваива...   20.4.2010, 19:34
- - Влад   POD - Plain Old Data.   20.4.2010, 19:19
- - Litkevich Yuriy   Цитата(Влад @ 20.4.2010, 23:12) // эта ош...   20.4.2010, 19:23
- - Влад   Юрий, просто Стандарт языка (п. 5.3.5 положение (c...   20.4.2010, 21:36
- - Litkevich Yuriy   Цитата(Влад @ 20.4.2010, 23:12) см. Сатте...   21.4.2010, 12:57
- - AD   Цитата(Litkevich Yuriy @ 21.4.2010, 13:57...   21.4.2010, 17:48


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 27.4.2024, 16:26