crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 28.3.2024, 18:53