Форум программистов, компьютерный форум CyberForum.ru

С++ оператор присвоения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
10.11.2013, 17:28     С++ оператор присвоения #1
Всем доброго времени суток.
Я написал класс в котором имеется приватный указатель или вернее 2 мерный массив.
Выглядит он вот так вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    class Bitmap
    {
        protected:
            Pixel** pixels = nullptr;
            Vector2 Size;
 
        public:
            //= Конструкторы / Деструкторы =============================
            Bitmap();
            virtual ~Bitmap();
            Bitmap(Vector2 size);
 
            //= Возращающие ============================================
            Pixel   GetPixel(Vector2 position);
 
            //= Перегруженные операторы ================================
            //Bitmap operator=(const Bitmap right);
 
    };
Проблема в том, что при присвоении через оператор '=' я натыкаюсь на неизбежную ошибку во время деструкции.
Как то так например:
C++
1
2
3
Bitmap amp = Bitmap(Vector2(25,25));
Bitmap bmp = amp;
// При уничтожении amp, ресурсы на которые ссылается bmp так же прекратят своё существование
Я попытался переписать оператор присвоения, пока что тупо с помощью инициализации.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    Bitmap Bitmap::operator=(const Bitmap right)
    {
        //проверка на самоприсваивание
        if (this == &right)
        {
            return *this;
        }
 
        Size = right.GetSize();
        pixels = new Pixel*[Size.x]();
        for(unsigned int x = 0; x < Size.x; x++)
            pixels[x] = new Pixel[Size.y]();
 
        return *this;
    }
Ошибка всё равно вылазит.
Помогите, что я делаю не так???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.11.2013, 17:38     С++ оператор присвоения #2
Shaman163, я твой говнокод не смотрел, но понял в чом причина, ты просто видимо при присваивании ссылку передаешь на ту же самую область памяти, а нужно заново новую область памяти выделять. В операторе присваивания новую область памяти выделяй и в нее копируй значение из объекта который ты хочешь присвоить, а то у тебя получается раз деструктор вызвался для ячейки допустим по адресу1 и ты снова в другом деструкторе уничтожаешь тот же самый адресс1, поэтому и ошибка.

Добавлено через 4 минуты
Shaman163, возможно ошибка из за того что ты тут копию объекта вернул Bitmap Bitmap::operator=(const Bitmap right), а нужно ссылку, возможно вызвался деструктор в автопамяти и удалил адрес который ты выделил.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
10.11.2013, 17:49     С++ оператор присвоения #3
Цитата Сообщение от Shaman163 Посмотреть сообщение
Проблема в том, что при присвоении через оператор '='
Сделайте конструктор копирования еще!
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
10.11.2013, 22:17  [ТС]     С++ оператор присвоения #4
ninja2 Огромное вам спасибо за то что рассказали мне о том, что я и так знал. Я не спрашивал что за ошибка, я спрашивал как её избежать. С ссылками пробовал, первый раз вообще с хабра скопировал пример перегрузки, но так как ошибка всё равно была, решил попробовать так как есть сейчас..
Вот код, до моей самодеятельности:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    Bitmap& Bitmap::operator=(const Bitmap& right)
    {
        if (this == &right)
        {
            return *this;
        }
 
        Size = right.GetSize();
        pixels = new Pixel*[Size.x]();
        for(unsigned int x = 0; x < Size.x; x++)
            pixels[x] = new Pixel[Size.y]();
 
        return *this;
    }
Но как я уже сказал, проблему это не решает. И да, попрошу без оскорблений.

Добавлено через 45 минут
Croessmah
Большое спасибо, до этого вообще не знал о конструкторе копирования
Буду признателен если кто нибудь на пальцах покажет где именно вызывается оператор присвоения..
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.11.2013, 23:28     С++ оператор присвоения #5
Shaman163, Ты вообще походу не понимаешь почему у тебя ошибка происходит знаток, ты обращаешься к недействительному указателю, исправь и все будет работать.

Добавлено через 2 минуты
Цитата Сообщение от Shaman163 Посмотреть сообщение
// При уничтожении amp, ресурсы на которые ссылается bmp так же прекратят своё существование
Ну знаешь в чом ошибка выдели новый ресурс, не используй одинаковые ресурсы.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
10.11.2013, 23:47     С++ оператор присвоения #6
Цитата Сообщение от Shaman163 Посмотреть сообщение
где именно вызывается оператор присвоения..
Там, где происходит присваивание, то есть
C++
1
объект1 = объект2 ;
при
C++
1
ТипОбъекта объект1 = объект2 ;
будет вызван конструктор копий, так это не присвоение, а создание объекта1 на основе объекта2
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
11.11.2013, 00:21     С++ оператор присвоения #7
Цитата Сообщение от Croessmah Посмотреть сообщение
будет вызван конструктор копий, так это не присвоение, а создание объекта1 на основе объекта2
Чо сразу конструктор копий? а мб он просто ссылку создаст и увеличит счетчик ссылок используя методику "copy on write"?

Добавлено через 2 минуты
Там может и не вызваться конструктор копий, он просто код повторит конструктора копирования и вернет ссылку на объект. Можно б конструктор копирования и не создавать.
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
11.11.2013, 17:56  [ТС]     С++ оператор присвоения #8
Цитата Сообщение от ninja2 Посмотреть сообщение
Ты вообще походу не понимаешь почему у тебя ошибка происходит знаток
Ну так вы же сами привели строку где я и сообщаю о том, что понимаю где именно происходит ошибка и почему..
Но меня больше заинтересовало то что вы назвали мой класс гавнокодом, можете как то аргументировать? Ну помимо той проблемы с деструкцией из за которой собственно весь сыр-бор.
Хотелось бы услышать совет от Гуру C++.
Croessmah, и снова спасибо за разъяснение.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.11.2013, 06:37     С++ оператор присвоения #9
Цитата Сообщение от Shaman163 Посмотреть сообщение
Хотелось бы услышать совет от Гуру C++.
То я для красоты словечко добавил, на самом деле я считаю любой код рабочий нормальным, правда щас переписываю код из пхп на С++ ну я его полтора года назад писал, так там да такое понаписано - не оптимизировано например файл можно раз было считать и данные в цикл передавать, а я в цикле каждый раз считываю. Да после С++ пхп вообще детским языком кажется, я сайт который раньше на пхп месяц делал, щас за 2 дня сделал, что называется скил С++ )) . Да пхп после С++ вообще не интересный язык!!!
Croessmah
12.11.2013, 06:44
  #10

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
Да после С++ пхп вообще детским языком кажется, я сайт который раньше на пхп месяц делал, щас за 2 дня сделал, что называется скил С++
На полке пирожок лежит
Цитата Сообщение от Shaman163 Посмотреть сообщение
Хотелось бы услышать совет от Гуру C++.
- Самозванец...
- От самозванца слышу!
(c) Иван Васильевич меняет профессию

ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.11.2013, 06:50     С++ оператор присвоения #11

Не по теме:

Блин Croessmah, уже ответил, а я хотел подредактировать сообщение выше, ну ладно...



Добавлено через 6 минут
Ладно скоро господа увидете бесплатную cms: "kselax cms" - легкий движок для сайта на текстовых файлах от гуру С++ и экс эксперта ПХП, выложу в папбик, за 3 дня писаный килобайт 30 примерно веса и скорость загрузки страницы 0.01 секунда, короче бешеный движок можно использовать для высоконагруженных проектов. Доки только оформлю и видео-инструкцию по установке и использованию.
gray_fox
12.11.2013, 08:17
  #12

Не по теме:

Цитата Сообщение от ninja2 Посмотреть сообщение
"kselax cms" - легкий движок для сайта на текстовых файлах от гуру С++ и экс эксперта ПХП, выложу в папбик, за 3 дня писаный килобайт 30 примерно веса и скорость загрузки страницы 0.01 секунда, короче бешеный движок можно использовать для высоконагруженных проектов.
Ну ждём релиз тогда)

Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
17.11.2013, 21:03  [ТС]     С++ оператор присвоения #13
Кстати всегда мучил вопрос по поводу полей класса внутри операторов.
Если посмотреть на тот же хабровский код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Integer
{
private:
    int value;
public:
    Integer(int i): value(i) 
    {}
 
    Integer& operator=(const Integer& right) {
        //проверка на самоприсваивание
        if (this == &right) {
            return *this;
        }
        value = right.value;
        return *this;
    }
};
То мы увидим обращение к приватной переменной класса..
А это просто ломает всю мою сложившуюся у меня о C++ парадигму. Правильно ли я понял, что у перегрузки операторов есть свои привилегии?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2013, 21:18     С++ оператор присвоения
Еще ссылки по теме:

Присвоения переменим значений C++
Оператор присвоения для класса C++
Результат присвоения строке C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11811 / 6790 / 767
Регистрация: 27.09.2012
Сообщений: 16,840
Записей в блоге: 2
Завершенные тесты: 1
17.11.2013, 21:18     С++ оператор присвоения #14
Цитата Сообщение от Shaman163 Посмотреть сообщение
Правильно ли я понял, что у перегрузки операторов есть свои привилегии?
C++
1
Integer& operator=(const Integer& right)
это такой же член класса, как и другие и у него есть доступ к приватной области. Другое дело если будет описан "внешний" оператор присваивания
Yandex
Объявления
17.11.2013, 21:18     С++ оператор присвоения
Ответ Создать тему
Опции темы

Текущее время: 04:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru