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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Shaman163
4 / 4 / 0
Регистрация: 22.12.2011
Сообщений: 134
#1

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

10.11.2013, 17:28. Просмотров 1922. Ответов 13
Метки нет (Все метки)

Всем доброго времени суток.
Я написал класс в котором имеется приватный указатель или вернее 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;
    }
Ошибка всё равно вылазит.
Помогите, что я делаю не так???
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2013, 17:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос С++ оператор присвоения (C++):

Шаблоны и оператор присвоения - C++
что я не правильно делаю? у меня входит в бесконечную рекурсию на операторе присвоения template &lt;typename T&gt; class A { public: ...

Оператор присвоения для класса - C++
Никак не получается написать оператор присвоения. Помогите пожалуйста! #include &lt;iostream&gt; #include &lt;conio.h&gt; using namespace std;...

Оператор присвоения в бинарном дереве - C++
Не смог разобраться. Прокомментируйте, будьте добры. Задание такое, определите стандартный конструктор и функции управления...

Конструктор перемещения и оператор присвоения для двусвязного списка - C++
Добрый день. Помогите разобраться в вопросом: пишу реализацию двусвязного списка, хотел бы разобраться с конструктором перемещения и...

Создать класс Str (символьная строка). Переопределить оператор присвоения. - C++
Помогите решить с обяснениями. Создать класс Str (символьная строка). Переопределить оператор присвоения.

Оператор присвоения копии для класса, действующего как значения - C++
Приветсвую. Увидел в книге Липпмана, &quot;Язык программирования С++. Базовый курс&quot;, определение оператора присвоения для класса, действующего...

13
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.11.2013, 17:38 #2
Shaman163, я твой говнокод не смотрел, но понял в чом причина, ты просто видимо при присваивании ссылку передаешь на ту же самую область памяти, а нужно заново новую область памяти выделять. В операторе присваивания новую область памяти выделяй и в нее копируй значение из объекта который ты хочешь присвоить, а то у тебя получается раз деструктор вызвался для ячейки допустим по адресу1 и ты снова в другом деструкторе уничтожаешь тот же самый адресс1, поэтому и ошибка.

Добавлено через 4 минуты
Shaman163, возможно ошибка из за того что ты тут копию объекта вернул Bitmap Bitmap::operator=(const Bitmap right), а нужно ссылку, возможно вызвался деструктор в автопамяти и удалил адрес который ты выделил.
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 1
10.11.2013, 17:49 #3
Цитата Сообщение от Shaman163 Посмотреть сообщение
Проблема в том, что при присвоении через оператор '='
Сделайте конструктор копирования еще!
1
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
Большое спасибо, до этого вообще не знал о конструкторе копирования
Буду признателен если кто нибудь на пальцах покажет где именно вызывается оператор присвоения..
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
10.11.2013, 23:28 #5
Shaman163, Ты вообще походу не понимаешь почему у тебя ошибка происходит знаток, ты обращаешься к недействительному указателю, исправь и все будет работать.

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

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

Не по теме:

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

0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
12.11.2013, 06:50 #11

Не по теме:

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



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

Не по теме:

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

0
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++ парадигму. Правильно ли я понял, что у перегрузки операторов есть свои привилегии?
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 1
17.11.2013, 21:18 #14
Цитата Сообщение от Shaman163 Посмотреть сообщение
Правильно ли я понял, что у перегрузки операторов есть свои привилегии?
C++
1
Integer& operator=(const Integer& right)
это такой же член класса, как и другие и у него есть доступ к приватной области. Другое дело если будет описан "внешний" оператор присваивания
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2013, 21:18
Привет! Вот еще темы с ответами:

присвоения константе - C++
Допустим у нас есть класс: class Class{ public: Class(int = 5); private: const int n; }; Class::Class(int _n) {

Перегрузка присвоения - C++
Вообщем, есть некий класс А, который хранит в себе массив: class A { private: int Arr; }; Необходимо создать...

перегрузка оператора присвоения - C++
// radius.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Присвоения переменим значений - C++
Можно ли присвоить переменой не чисельное значения, и если да, то как?


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
17.11.2013, 21:18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru