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

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

Войти
Регистрация
Восстановить пароль
 
 
mxs89
11 / 11 / 4
Регистрация: 13.04.2015
Сообщений: 157
Завершенные тесты: 1
#1

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

04.08.2016, 01:43. Просмотров 595. Ответов 24
Метки нет (Все метки)

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

Почему прога может зависать при инициализации массива - C++
Проект в VS2010 простое консольное приложение Есть массив string vesa_str; При его инициализации внутри функции прога зависает....

При отладке программы вылетает окошко с ошибкой: использование переменной без инициализации - C++
код: #include &lt;iostream&gt; #include &lt;conio.h&gt; int A,n,m; using namespace std; void poisk1(); void poisk2(); int main() ...

Почему я не попадаю в специализацию шаблона? - C++
Почему я не попадаю в специализацию шаблона? template&lt;&gt; box&amp; max(box&amp;, box&amp;); #include&lt;iostream&gt; struct box { char...

Почему при инициализации данных программа работает быстрей? - C++
Почему при инициализации данных программа работает быстрей?

Почему при инициализации строки, сначала создаётся пустой объект? - C++
Чтобы при создании присвоить строке какое-то значение, можно использовать два способа: string str1(”bla-bla-bla”); или string str2 =...

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

24
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
04.08.2016, 01:57 #2
mxs89, пробывали в онлайн компиляторах?

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

1) int const &value и int& value одно и тоже как бы
2) попробуйте словить Integer& operator=(int&& value)
0
mxs89
11 / 11 / 4
Регистрация: 13.04.2015
Сообщений: 157
Завершенные тесты: 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
0
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
04.08.2016, 02:17 #4
Цитата Сообщение от mxs89 Посмотреть сообщение
нет, пробую в VS 2015
Да, надо пробывать, чтобы удостовериться еще в других компиляторах - вдруг ваш компилятор ошибается

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

Цитата Сообщение от mxs89 Посмотреть сообщение
в отладке не попадаю в обработчик
Цитата Сообщение от mxs89 Посмотреть сообщение
нет, попадаю туда на строке i = 16
Да, я смотрю уже попадаете - тему можно закрывать
0
mxs89
11 / 11 / 4
Регистрация: 13.04.2015
Сообщений: 157
Завершенные тесты: 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;
так ошибка компиляции
0
rikimaru2013
04.08.2016, 02:21
  #6

Не по теме:

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

0
mxs89
11 / 11 / 4
Регистрация: 13.04.2015
Сообщений: 157
Завершенные тесты: 1
04.08.2016, 02:36  [ТС] #7
типы разные

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

Разобрался
C++
1
2
3
4
Integer& operator=( const Integer& value )
    {       
        return *this;
    }
ловит так как _Ty const &value имеет тип Integer. А то, что компилятор сгенерирует оператор присвоения по умолчани даже если же есть оператор присвоения, что принимает другой тип - не знал (как в принципе много в С++ )
1
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,371
Завершенные тесты: 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_;
0
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
04.08.2016, 12:27 #11
hoggy, получается правила не генирировать оператор=, если он реализован хоть и для другого типа - нету?
0
mxs89
11 / 11 / 4
Регистрация: 13.04.2015
Сообщений: 157
Завершенные тесты: 1
04.08.2016, 12:36  [ТС] #12
спасибо, то что с типами ошибся, это понял, вопрос, если не определяю свой оператор = для типа Integer, компилятор генерируют по умолчанию что то и получается, что параметр передается не по ссылке, а копируется?

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

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

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

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

Цитата Сообщение от mxs89 Посмотреть сообщение
передается не по ссылке, а копируется?
нет конечно.
передается по ссылке.
1
mxs89
11 / 11 / 4
Регистрация: 13.04.2015
Сообщений: 157
Завершенные тесты: 1
04.08.2016, 12:55  [ТС] #14
понял, происходит побитовое копирование, верно?
0
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,371
Завершенные тесты: 1
04.08.2016, 12:56 #15
Цитата Сообщение от mxs89 Посмотреть сообщение
понял, происходит побитовое копирование, верно?
нет, не верно.

дефолтный оператор= выполняет почленное присвоение.
0
04.08.2016, 12:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.08.2016, 12:56
Привет! Вот еще темы с ответами:

Заполнение массива при инициализации - C++
Доброго времени суток. Имеется следующий код: struct ProcessInfo { HANDLE ProcessHandle; DWORD ProcessID; HANDLE...

Ошибка при инициализации массива - C++
В примере есть массив: sf::String TileMap = { &quot; &quot;, &quot; ...

Ошибка при инициализации массива - C++
Что делать? Так как я понимаю, точку с запятой вообще в помине не должно здесь быть!о_О

Заполнение массива при инициализации - C++
int arr; Как массив сразу заполнить нулями?


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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