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

При инициализации массива в отладке не попадаю в обработчик, поясните почему? - C++

Восстановить пароль Регистрация
 
 
mxs89
10 / 10 / 4
Регистрация: 13.04.2015
Сообщений: 140
Завершенные тесты: 1
04.08.2016, 01:43     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #1
имеется два класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
struct Integer
{
    explicit Integer(int const &value)
        : value_(value)
        {
        }
    Integer()
        :value_(0)
        {
        }
    Integer &operator=(int const &value)
        {
        value_ = value;
        return *this;
        }
private:
    int value_;
};
 
template<class _Ty>
    struct Array
{
    explicit Array(size_t const &size, _Ty const &value)
        : size_(size), elements_(new _Ty[size])
        {
        for (size_t i = 0; i < size; i++)
            *(elements_ + i) = value;
        }
    ~Array()
        {
        if (elements_)
            delete[]elements_;
        elements_ = 0;
        size_ = 0;
        }
private:
    _Ty *elements_;
    size_t size_;
};
при инициализации массива происходит копирование значения по средствам оператора =, в отладке не попадаю в обработчик, поясните почему?

C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    Integer i(15);
 
    auto value = std::make_unique<Array<Integer>>(10, i);
 
    i = 16;
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.08.2016, 01:43     При инициализации массива в отладке не попадаю в обработчик, поясните почему?
Посмотрите здесь:

Почему при инициализации данных программа работает быстрей? C++
Почему прога может зависать при инициализации массива C++
C++ Ошибка при инициализации массива
C++ Заполнение массива при инициализации
При отладке программы вылетает окошко с ошибкой: использование переменной без инициализации C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
04.08.2016, 01:57     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #2
mxs89, пробывали в онлайн компиляторах?

Вот один из http://ideone.com/0HOgXh
Заходит в operator=

1) int const &value и int& value одно и тоже как бы
2) попробуйте словить Integer& operator=(int&& value)
mxs89
10 / 10 / 4
Регистрация: 13.04.2015
Сообщений: 140
Завершенные тесты: 1
04.08.2016, 02:11  [ТС]     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #3
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
пробывали в онлайн компиляторах
нет, пробую в VS 2015

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) int const &value и int& value одно и тоже как бы
нет, я запрещаю менять ссылку в теле метода

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
2) попробуйте словить Integer& operator=(int&& value)
нет, попадаю туда на строке i = 16
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
04.08.2016, 02:17     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #4
Цитата Сообщение от mxs89 Посмотреть сообщение
нет, пробую в VS 2015
Да, надо пробывать, чтобы удостовериться еще в других компиляторах - вдруг ваш компилятор ошибается

Цитата Сообщение от mxs89 Посмотреть сообщение
нет, я запрещаю менять ссылку в теле метода
Да, вам стоит перечитать про ссылки еще раз

Цитата Сообщение от mxs89 Посмотреть сообщение
в отладке не попадаю в обработчик
Цитата Сообщение от mxs89 Посмотреть сообщение
нет, попадаю туда на строке i = 16
Да, я смотрю уже попадаете - тему можно закрывать
mxs89
10 / 10 / 4
Регистрация: 13.04.2015
Сообщений: 140
Завершенные тесты: 1
04.08.2016, 02:21  [ТС]     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #5
Цитата Сообщение от mxs89 Посмотреть сообщение
менять ссылку в теле метода
не, значение ссылки

Добавлено через 1 минуту
смотрите, я попадаю в оператор = , где устанавливаю i = 16, а в конструкторе массива в цикле идет присваивание, разве там я не должен попадать в оператор =?

Добавлено через 1 минуту
C++
1
2
3
4
5
6
7
8
9
10
    
Integer &operator=(int &value)
        {
        value_ = value;
        value = 10;
        return *this;
        }
    int j = 16;
 
    i = j;
так я меняю j
C++
1
2
3
4
5
6
7
8
9
10
    
Integer &operator=(int const &value)
        {
        value_ = value;
        value = 10;
        return *this;
        }
    int j = 16;
 
    i = j;
так ошибка компиляции
rikimaru2013
04.08.2016, 02:21
  #6

Не по теме:

только сейчас понял, что int const& value это кривая записать const int& value

mxs89
10 / 10 / 4
Регистрация: 13.04.2015
Сообщений: 140
Завершенные тесты: 1
04.08.2016, 02:36  [ТС]     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #7
типы разные

Добавлено через 6 минут
поясните пожалуйста, что происходит на строке 27, вызов оператора = по умолчанию, происходит копирование объекта?
zss
Модератор
Эксперт С++
 Аватар для zss
5950 / 5555 / 1786
Регистрация: 18.12.2011
Сообщений: 14,195
Завершенные тесты: 1
04.08.2016, 07:20     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #8
Похоже, Вы перепутали инициализацию и operator=
В такой конструкции
C++
1
type name=value;
вызывается копиконструктор
А в такой конструкции
C++
1
2
type name;
name=value;
вызывается operator=
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
04.08.2016, 10:59     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #9
zss, там разъименнование указателя и присвоение ему значения, а не инициализация. Инициализация в списке инициализации дефолтными конструкторами.

Разобрался
C++
1
2
3
4
Integer& operator=( const Integer& value )
    {       
        return *this;
    }
ловит так как _Ty const &value имеет тип Integer. А то, что компилятор сгенерирует оператор присвоения по умолчани даже если же есть оператор присвоения, что принимает другой тип - не знал (как в принципе много в С++ )
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
04.08.2016, 12:16     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #10
Цитата Сообщение от mxs89 Посмотреть сообщение
поясните почему?
потому что в строке:
C++
1
*(elements_ + i) = value;
вы объекту типа Integer пытаетесь присвоить значение Integer

однако, у вас нет operator= который принимал бы объект типа Integer

кстати, вас не смущает, что компиляторы ворнинги кидают на ваш код?
source_file.cpp: In instantiation of ‘Array<_Ty>::Array(const size_t&, const _Ty&) [with _Ty = Integer; size_t = long unsigned int]’:
/usr/include/c++/4.9/bits/unique_ptr.h:765:69: required from ‘typename std::_MakeUniq<_Tp>::__single_object std::make_unique(_Args&& ...) [with _Tp = Array<Integer>; _Args = {int, Integer&}; typename std::_MakeUniq<_Tp>::__single_object = std::unique_ptr<Array<Integer>, std::default_delete<Array<Integer> > >]’
source_file.cpp:57:56: required from here
source_file.cpp:47:12: warning: ‘Array<Integer>::size_’ will be initialized after [-Wreorder]
я б на вашем месте поменял местами:

C++
1
2
3
private:
    _Ty *elements_;
    size_t size_;
на:

C++
1
2
3
private:
    size_t size_;
    _Ty *elements_;
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2137 / 970 / 223
Регистрация: 30.11.2013
Сообщений: 3,240
04.08.2016, 12:27     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #11
hoggy, получается правила не генирировать оператор=, если он реализован хоть и для другого типа - нету?
mxs89
10 / 10 / 4
Регистрация: 13.04.2015
Сообщений: 140
Завершенные тесты: 1
04.08.2016, 12:36  [ТС]     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #12
спасибо, то что с типами ошибся, это понял, вопрос, если не определяю свой оператор = для типа Integer, компилятор генерируют по умолчанию что то и получается, что параметр передается не по ссылке, а копируется?

т.е.
Integer&operator=(Integer v), происходит копирование? и объект размещается в памяти _elements+i????

Добавлено через 1 минуту
ворнингов не наблюдал
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
04.08.2016, 12:43     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
получается правила не генирировать оператор=, если он реализован хоть и для другого типа - нету?
нету.

есть случаи при которых компилятор его сам не генерирует.
например, если есть константные данные-члены,
или ссылки данные-члены.

или если бы явно объявлен оператор= с мув-семантикой.

Цитата Сообщение от mxs89 Посмотреть сообщение
передается не по ссылке, а копируется?
нет конечно.
передается по ссылке.
mxs89
10 / 10 / 4
Регистрация: 13.04.2015
Сообщений: 140
Завершенные тесты: 1
04.08.2016, 12:55  [ТС]     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #14
понял, происходит побитовое копирование, верно?
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
04.08.2016, 12:56     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #15
Цитата Сообщение от mxs89 Посмотреть сообщение
понял, происходит побитовое копирование, верно?
нет, не верно.

дефолтный оператор= выполняет почленное присвоение.
mxs89
10 / 10 / 4
Регистрация: 13.04.2015
Сообщений: 140
Завершенные тесты: 1
04.08.2016, 13:01  [ТС]     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #16
Цитата Сообщение от hoggy Посмотреть сообщение
дефолтный оператор= выполняет почленное присвоение
где об этом можно почитать?
hoggy
5229 / 2120 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
04.08.2016, 13:07     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #17
Цитата Сообщение от mxs89 Посмотреть сообщение
где об этом можно почитать?
http://www.open-std.org/JTC1/SC22/WG...2013/n3690.pdf
gru74ik
Модератор
 Аватар для gru74ik
3121 / 1347 / 167
Регистрация: 20.02.2013
Сообщений: 3,852
Записей в блоге: 17
04.08.2016, 13:19     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #18
Цитата Сообщение от hoggy Посмотреть сообщение
http://www.open-std.org/JTC1/SC22/WG...2013/n3690.pdf
Вот поновее: http://www.open-std.org/jtc1/sc22/wg...2013/n3797.pdf
Ferrari F1
Заблокирован
298 / 284 / 62
Регистрация: 27.01.2015
Сообщений: 1,912
Записей в блоге: 1
Завершенные тесты: 1
04.08.2016, 18:19     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #19
mxs89, в книге Липпмана об этом есть, во всей 13 главе об этом идет речь (о кон-рах копирования, перемещения, операторах присваивания, деструкторах, ну и еще о move семантике остаток главы)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2016, 00:03     При инициализации массива в отладке не попадаю в обработчик, поясните почему?
Еще ссылки по теме:

C++ Ошибка при инициализации массива
C++ Почему при инициализации строки, сначала создаётся пустой объект?
C++ Почему я не попадаю в специализацию шаблона?

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11841 / 6820 / 771
Регистрация: 27.09.2012
Сообщений: 16,911
Записей в блоге: 2
Завершенные тесты: 1
05.08.2016, 00:03     При инициализации массива в отладке не попадаю в обработчик, поясните почему? #20
Цитата Сообщение от gru74ik Посмотреть сообщение
Вот поновее
Даешь прогресс: http://open-std.org/JTC1/SC22/WG21/d...2016/n4594.pdf
Yandex
Объявления
05.08.2016, 00:03     При инициализации массива в отладке не попадаю в обработчик, поясните почему?
Ответ Создать тему
Опции темы

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