crossplatform.ru

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

2 страниц V  < 1 2  
Ответить в данную темуНачать новую тему
> как протестировать оператор присваивания и конструктор копирования класса?
Влад
  опции профиля:
сообщение 20.4.2010, 19:12
Сообщение #11


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

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




Репутация:   8  


Я немного подправил код.... Правда, не компилировал! Только то, что бросается в глаза при чтении.
Раскрывающийся текст
#include "ybuffer1.h"

#include <QtGlobal>


YBuffer1::YBuffer1(const char *abuffer, unsigned int asize)
{
    theSize = asize;
    theBuffer = new char[asize];
    // тут надо скопировать содержимое
    // поскольку abuffer - POD, то можно не делать цикл, а тупо использовать memcpy
    // или использовать std::copy
    memcpy(theBuffer, abuffer, asize);
    // хотя можно использовать и цикл... дело вкуса, но практически всегда memcpy выполняется
    // быстрее.
/*    
    unsigned int cnt = 0;
    while(cnt != asize){
        theBuffer[cnt] = abuffer[cnt];
        cnt++;
    }
*/
}

YBuffer1::~YBuffer1()
{
    // эта ошибка приводит к UB! Стандарт, 5.3.5/2
    /* delete theBuffer; */
    delete[] theBuffer;
}

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

YBuffer1& YBuffer1::operator=(const YBuffer1 &other)
{
    // 1. проверить присваивание самому себе, типа i = i;
    if (this != &other)
    {
        // 2. перед выделением нового буфера надо удалить старый.
        // Еще лучше - использовать технику, безопасную по отношению к исключениям,
        // см. Саттер, "Решение сложных задач на C++"
        delete[] theBuffer;
        
        theBuffer = new char[other.size()];
        // тут надо скопировать содержимое
        copy(other, *this);
        theSize = other.size();
    }
    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");
    memcpy(destination.theBuffer, source.theBuffer, source.size());
/*    
    unsigned int cnt = 0;
    while(cnt != size){
        destination[cnt] = source[cnt];
        cnt++;
    }
*/
}

// здесь везде i должны быть строго < theSize!
    
const char& YBuffer1::at(unsigned int i) const
{
    Q_ASSERT_X(i < theSize, "YBuffer1::at()", "requested index too big");
    return theBuffer[i];
}

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

char YBuffer1::operator[](unsigned int i) const
{
    Q_ASSERT_X(i < theSize, "YBuffer1::operator[]", "requested index too big");
    return theBuffer[i];
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.4.2010, 19:16
Сообщение #12


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

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

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




Репутация:   94  


Цитата(DIMEDROLL @ 20.4.2010, 23:07) *
что такое КК и ОП?
Конструктор Копирования и Оператор Присваивания

Цитата(Влад @ 20.4.2010, 23:12) *
поскольку abuffer - POD
что означает эта абревиатура?

Цитата(DIMEDROLL @ 20.4.2010, 23:07) *
Что-то это что?
чёткий эффект это какой?
Что-то - некоректный КК и/или ОП
чёткий, например сообщение: "Конструктор копирования работает не корректно"
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 20.4.2010, 19:19
Сообщение #13


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

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




Репутация:   8  


POD - Plain Old Data.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.4.2010, 19:23
Сообщение #14


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

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

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




Репутация:   94  


Цитата(Влад @ 20.4.2010, 23:12) *
// эта ошибка приводит к UB! Стандарт, 5.3.5/2
/* delete theBuffer; */
delete[] theBuffer;
вот про это я не понял, а что тут неопределённого?

Цитата(Влад @ 20.4.2010, 23:12) *
// здесь везде i должны быть строго < theSize!
О-о-о, надо срочником тест подправить, а то выход за пределы индексации я не проверял. Спасибо!

Цитата(Влад @ 20.4.2010, 23:19) *
Plain Old Data
это мне тоже ни о чём не говорит, "Плоские старые данные" :unknw:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 20.4.2010, 19:34
Сообщение #15


Участник
**

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

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




Репутация:   0  


Цитата
Конструктор Копирования и Оператор Присваивания
Что-то - некоректный КК и/или ОП
чёткий, например сообщение: "Конструктор копирования работает не корректно"

В таком случае мой код(функция и оператор==) соотвествует данном описанию, если что не так - будет ассерт с сообщением.
POD это int, double, short .... тоесть встроенные типы Си
P.S гуглится за меньше минуту ;)
Добавлено: был неправ, POD - структура данных не имеющая никаких методов, только члены-переменные
википедия англ.

Сообщение отредактировал DIMEDROLL - 20.4.2010, 19:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 20.4.2010, 21:36
Сообщение #16


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

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




Репутация:   8  


Юрий, просто Стандарт языка (п. 5.3.5 положение (clause) 2) четко описывает требования к выделению и удалению памяти:
- если память была выделена по new для единичного объекта (неважно, какого типа) - то удаляться она должна только delete для единичного объекта;
- если память была выделена по new[] для массива объектов (array form) - то удаляться она должна только delete[] для массива объектов (тоже array form) и никак иначе.
Иначе поведение программы не определено (Otherwise behavior is undefined, если мой склероз мне не изменяет). Причем, Стандарт никак не конкретизирует это "неопределенное поведение" - программе разрешается делать все, что ей заблагорассудится, начиная от порчи памяти и невоспроизводимых глюков, и вплоть до format C:.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 21.4.2010, 12:57
Сообщение #17


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

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

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




Репутация:   94  


Цитата(Влад @ 20.4.2010, 23:12) *
см. Саттер, "Решение сложных задач на C++"
тут обнаружил дома книжку: "Герб Саттер и Андрей Александреску. Стандарты программирования на С++. 101 правило и рекомендация." :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 21.4.2010, 17:48
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 21.4.2010, 13:57) *
тут обнаружил дома книжку: "Герб Саттер и Андрей Александреску. Стандарты программирования на С++. 101 правило и рекомендация." :)

Круто. Как раз эту книжку давно хотел купить, но она неожиданно исчезла с прилавков магазинов! Почитай. Вещь, уверен, что полезная. Отдельные книги Саттера и Александреску я читал! :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 14.10.2019, 6:34