9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
||||||||||||||||
1 | ||||||||||||||||
Метод в конструкторе вызывается задолго после создания объекта28.06.2019, 14:52. Показов 3763. Ответов 27
Не знаю как загуглить это, поэтому обращаюсь к живым людям.
Есть классы Group, Student, Subject. Group хранит вектор Student'ов, Student хранит вектор Subject'ов. Мы имеем вектор Group'ов. Дальше кодом:
Однако в консоли, порядок не такой. Выводится наоборот:
Сначала думал, что это из-за std::vector<Group>. Исправил на std::vector<Group*> (и так с каждым вложенным вектором). Дело оказалось не в этом. Предполагаю, что это из-за механики с++, о которой я еще не знаю (конструкторы в векторе = магия). Однако, я помню про предыдущее замечание с "утками, гусями..", поэтому если нужен полный код, пишите - скину. Сейчас не хочу засорять вопрос. (Чувствую опять билеберду написал) Добавлено через х минут Кстати, в чем отличие между vector<C> и vector<C*> ? Понятно, что во втором случае объект по ссылке передается. Однако очевидную разницу я не заметил
0
|
28.06.2019, 14:52 | |
Ответы с готовыми решениями:
27
Задать метод в объекте класса после создания самого объекта Как сделать камеру дочерним объектом после создания другого объекта, или отображение сцены после создания самой камеры? Какой метод вызывается при инициализации объекта Как правильно вызывается метод SaveAs объекта ActiveWorkbook? |
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
28.06.2019, 15:01 | 2 |
Сообщение было отмечено Moais как решение
Решение
Moais, честно говоря, ничего не понятно. Скорее всего у вас ошибка где-то в коде, который вы не показали
Очевидная разница в том, что первом случае вектор хранит объект типа С, а во втором объект типа указатель на С. Точно такой же вопрос можно было задать про то, чем отличается vector<int> и vector<double>. Ответ будет таким же, хранятся объекты разных типов. Добавлено через 2 минуты Вот, например, хотелось бы видеть как устроена функция createSubjects();
1
|
6579 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
28.06.2019, 15:07 | 3 |
0
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
||||||||||||||||
28.06.2019, 15:12 [ТС] | 4 | |||||||||||||||
DrOffset, сейчас покажу, что же у меня за фобия - код показывать? (Наступаю на те же грабли)
Как обзывать файлы кода? Нужно что-то внутри тегов [СРР] прописывать?
0
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 15:13 [ТС] | 5 |
oleg-m1973, да, код ниже - докажет это: )
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
28.06.2019, 15:18 | 6 |
Сообщение было отмечено Moais как решение
Решение
Будем разбираться итеративно.
Это неверно. capacity() - это количество доступной памяти для элементов, а не количество элементов. Количество элементов - это size() Добавлено через 4 минуты Совсем нет. Тут вы обнуляете первый (нулевой элемент).
1
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 15:33 [ТС] | 7 |
Хотел спросить: "Чем отличается capacity от size". Нашел вот это: Отличие size от capacity
Добавлено через five минут DrOffset, окей, а без цикла никак не обнулить разом весь статический массив? По поводу очередности вызовов. "-858993460" - как понимаю, следствие не инициализированного массива. Окей. Однако в методе readFromFile(), в строке rateCount[i] = (int)r8s.capacity(); (которая уже исправлена на size), мы видим, что i-му элементу присваивается значение. Почему же при вызове метода writeAllInfo() она опять без заданного значения? Это точно не из-за отсутствия <Group*>?
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
28.06.2019, 15:33 | 8 |
Moais, я ж написал чем они отличаются
0
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 15:35 [ТС] | 9 |
DrOffset, написали. Вот только я не уверен был, правильно ли понял, что за доступная память: )
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
28.06.2019, 15:36 | 10 |
Смотря какого типа. Для целых можно использовать memset.
Скорее всего. Я так не думаю. Во-первых вы уверены. что везде убрали capacity? Он нигде в вашем коде не нужен. Во-вторых кода все еще мало. Давайте весь код в архиве.
0
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 15:39 [ТС] | 11 |
DrOffset,
Во-первых, да, уверен. ctrl+f по всем 4-м документам (даже в закомменченых областях его нет). Во-вторых, может проще ссылку на github?
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
28.06.2019, 15:40 | 12 |
Достаньте себе вот такой справочник (в каком угодно виде). И не используйте ни единой фукции из библиотек, пока не разберетесь что они точно делают.
Чем раньше вы привыкнете сначала внимательно читать документацию, а потом что-то делать, тем быстрее будет потом расти ваша зарплата (я не шучу). Добавлено через 33 секунды Это и лучше. Хотя бы буду видеть ваши изменения, если что.
1
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 15:45 [ТС] | 13 |
DrOffset, полностью согласен с вами. Это моя извечная проблема - сначала делать, а потом читать
Правда, планирую устроиться на java-разработчика. Слышал, что у плювощиков заказов все меньше Телепорт на гит
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
28.06.2019, 16:01 | 14 |
Moais, что-то у вас код на гитхабе отличается от того, что вы тут в теме показывали
0
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 16:04 [ТС] | 15 |
Тьфу!
Я же не обновил его. Все, можете проверить. В ветке main develoр
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|||||||||||||||||||||
28.06.2019, 16:18 | 16 | ||||||||||||||||||||
Moais, просто буду перечислять по порядку все, что увидел (запустить я ваш код все равно не могу)
1
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 20:03 [ТС] | 17 |
DrOffset,
А почему это ошибка? std::vector сам вызывает деструкторы у элементов? Разработчик std умнее меня objectSchool(_path, _name), rateCount() - вот это что-то новенькое! По-моему подобно объявляются константы, но для них еще значения указываются. вот конкретно , rateCount() этот кусок вызывает непонимание. Что это за прием, как называется, что делает?Добавлено почти сразу Предполагаю, что он обнуляет массив (а сейчас еще и проверю), но как? Как это работает?
0
|
6107 / 3461 / 1406
Регистрация: 07.02.2019
Сообщений: 8,794
|
|
28.06.2019, 20:10 | 18 |
Сообщение было отмечено Moais как решение
Решение
1
|
9 / 7 / 3
Регистрация: 03.02.2017
Сообщений: 124
|
|
28.06.2019, 20:13 [ТС] | 19 |
DrOffset, последовал вашим советам. Да, действительно, таинственная запись обнуляет массив, но природа ее не ясна. Метод в конструкторе по-прежнему вызывается после
Добавлено через 2 минуты zayats80888, мерси
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
28.06.2019, 21:10 | 20 |
Явный вызов деструкторов тоже убрали?
Попозже посмотрю еще раз ваш код. Или может кто другой еще посмотрит. Все, что уже сказано в любом случае справедливо, особенно про вызов деструкторов. Да, вектор сам вызывает их, и ваша запись провоцировала двойной вызов деструкторов для одних и тех же объектов, что является совершенно неприемлемым для корректной программы. Там у вас еще одно место, где вы делаете явный вызов деструктора - это тоже нужно обязательно исправить. Добавлено через 7 минут Moais, обновите версию на гитхабе с последними исправлениями. Я через часок еще раз гляну.
0
|
28.06.2019, 21:10 | |
28.06.2019, 21:10 | |
Помогаю со студенческими работами здесь
20
Не вызывается override метод при создании объекта через рефлексию В конструкторе вложенного класса инициализируется приватное поле. Потом вызывается функция-метод этого класса и выводит значение этого поля НО НЕ ТО! два раза вызывается событие live.() после load загрузки объекта jquery Не вызывается метод из базового типа после приведения типов? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |