crossplatform.ru

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


  Ответ в как протестировать оператор присваивания и конструктор копирования класса?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


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

Круто. Как раз эту книжку давно хотел купить, но она неожиданно исчезла с прилавков магазинов! Почитай. Вещь, уверен, что полезная. Отдельные книги Саттера и Александреску я читал! :)
Litkevich Yuriy Дата 21.4.2010, 12:57
 
Цитата(Влад @ 20.4.2010, 23:12) *
см. Саттер, "Решение сложных задач на C++"
тут обнаружил дома книжку: "Герб Саттер и Андрей Александреску. Стандарты программирования на С++. 101 правило и рекомендация." :)
Влад Дата 20.4.2010, 21:36
  Юрий, просто Стандарт языка (п. 5.3.5 положение (clause) 2) четко описывает требования к выделению и удалению памяти:
- если память была выделена по new для единичного объекта (неважно, какого типа) - то удаляться она должна только delete для единичного объекта;
- если память была выделена по new[] для массива объектов (array form) - то удаляться она должна только delete[] для массива объектов (тоже array form) и никак иначе.
Иначе поведение программы не определено (Otherwise behavior is undefined, если мой склероз мне не изменяет). Причем, Стандарт никак не конкретизирует это "неопределенное поведение" - программе разрешается делать все, что ей заблагорассудится, начиная от порчи памяти и невоспроизводимых глюков, и вплоть до format C:.
DIMEDROLL Дата 20.4.2010, 19:34
 
Цитата
Конструктор Копирования и Оператор Присваивания
Что-то - некоректный КК и/или ОП
чёткий, например сообщение: "Конструктор копирования работает не корректно"

В таком случае мой код(функция и оператор==) соотвествует данном описанию, если что не так - будет ассерт с сообщением.
POD это int, double, short .... тоесть встроенные типы Си
P.S гуглится за меньше минуту ;)
Добавлено: был неправ, POD - структура данных не имеющая никаких методов, только члены-переменные
википедия англ.
Litkevich Yuriy Дата 20.4.2010, 19:23
 
Цитата(Влад @ 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:
Влад Дата 20.4.2010, 19:19
  POD - Plain Old Data.
Litkevich Yuriy Дата 20.4.2010, 19:16
 
Цитата(DIMEDROLL @ 20.4.2010, 23:07) *
что такое КК и ОП?
Конструктор Копирования и Оператор Присваивания

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

Цитата(DIMEDROLL @ 20.4.2010, 23:07) *
Что-то это что?
чёткий эффект это какой?
Что-то - некоректный КК и/или ОП
чёткий, например сообщение: "Конструктор копирования работает не корректно"
Влад Дата 20.4.2010, 19:12
  Я немного подправил код.... Правда, не компилировал! Только то, что бросается в глаза при чтении.
Раскрывающийся текст
#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];
}
DIMEDROLL Дата 20.4.2010, 19:07
 
Цитата(Litkevich Yuriy @ 20.4.2010, 19:03) *
собственно, я рассматриваю, отсутствие, как частный (а может и вовсе жёсткий) случай неправильной реализации КК и ОП. Т.е. должен быть какой-то чёткий эффект если что-то сделано не верно.

что такое КК и ОП?
Цитата
Т.е. должен быть какой-то чёткий эффект если что-то сделано не верно.

Что-то это что?
чёткий эффект это какой?
Litkevich Yuriy Дата 20.4.2010, 19:03
 
Цитата(DIMEDROLL @ 20.4.2010, 22:59) *
не пишет реализацию конструктора копирования и оператора присваивания, то он подразумевает что по вариант по умолчанию его
собственно, я рассматриваю, отсутствие, как частный (а может и вовсе жёсткий) случай неправильной реализации КК и ОП. Т.е. должен быть какой-то чёткий эффект если что-то сделано не верно.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 5.7.2025, 2:42