crossplatform.ru

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

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


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

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

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




Репутация:   94  


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

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

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

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

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


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

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

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




Репутация:   94  


Цитата(Влад @ 20.4.2010, 22:06) *
Гмм.... А можно взглянуть на код этого YBuffer1?
можно, заодно может на косяки укажите:
ybuffer1.h
#ifndef YBUFFER1
#define YBUFFER1

/**    Класс YBuffer1 является ... .
*     Этот класс ...
*/
class YBuffer1
{

public:
    YBuffer1(const char *abuffer, unsigned int asize);
    ~YBuffer1();
    YBuffer1(const YBuffer1 &other);
    YBuffer1 &operator=(const YBuffer1 &other);
    
    const char& at(unsigned int i) const;
    char& operator[](unsigned int i);
    char operator[](unsigned int i) const;
    
    unsigned int size() const {return theSize;}

private:
    unsigned int theSize;
    char *theBuffer;

private:
    void copy(const YBuffer1 &source, YBuffer1 &destination);

};

#endif //YBUFFER1

ybuffer1.cpp
#include "ybuffer1.h"

#include <QtGlobal>


YBuffer1::YBuffer1(const char *abuffer, unsigned int asize)
{
    theSize = asize;
    theBuffer = new char[asize];
    // тут надо скопировать содержимое
    unsigned int cnt = 0;
    while(cnt != asize){
        theBuffer[cnt] = abuffer[cnt];
        cnt++;
    }
}

YBuffer1::~YBuffer1()
{
    delete theBuffer;
}

YBuffer1::YBuffer1(const YBuffer1 &other)
{
    theSize = other.size();
    theBuffer = new char[other.size()];
    // тут надо скопировать содержимое
    copy(other, *this);
}

YBuffer1& YBuffer1::operator=(const YBuffer1 &other)
{
    theSize = other.size();
    theBuffer = new char[other.size()];
    // тут надо скопировать содержимое
    copy(other, *this);
    return *this;
}

void YBuffer1::copy(const YBuffer1 &source, YBuffer1 &destination)
{
    unsigned int size = source.size();
    Q_ASSERT_X(size == destination.size(), "YBuffer1::copy()", "size of objects not eqal");
    unsigned int cnt = 0;
    while(cnt != size){
        destination[cnt] = source[cnt];
        cnt++;
    }
}

const char& YBuffer1::at(unsigned int i) const
{
    Q_ASSERT_X(i <= theSize, "YBuffer1::at()", "requested index too big");
    const char &data = theBuffer[i];
    return data;
}

char& YBuffer1::operator[](unsigned int i)
{
    Q_ASSERT_X(i <= theSize, "YBuffer1::operator[]", "requested index too big");
    char &data = theBuffer[i];
    return data;
}

char YBuffer1::operator[](unsigned int i) const
{
    Q_ASSERT_X(i <= theSize, "YBuffer1::operator[]", "requested index too big");
    char data = theBuffer[i];
    return data;
}


Цитата(DIMEDROLL @ 20.4.2010, 22:30) *
Для копируемых темплейтная фукция:
эта шаблонная функция ничего не даст, в отсутствии самописанных конструктора копирования и оператора присваивания

Цитата(DIMEDROLL @ 20.4.2010, 22:30) *
Весь код проверки находится в операторе сравнения(==).
про это не понял, где и как применяется
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- 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 Текстовая версия Сейчас: 26.4.2024, 1:31