8 / 8 / 1
Регистрация: 13.07.2014
Сообщений: 365
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
С2280 попытка ссылки на удалённую функцию02.08.2017, 20:43. Показов 11339. Ответов 10
Метки нет (Все метки)
Привет.
У меня есть 2 класса. 1 про Танки, другой про снаряды танка. И там и там есть конструктор по умолчанию и конструктор с нужными аргументами. В главной функции (в хэдэре) логики я объявляю 2 вектора: один вектор тип танк, другой тип снаряда.
Что-то типа того:
В функции проверки столкновений я принимаю эти вектора.
А у танка armor--; И следом идёт проверка всех танков (отдельным циклом), если броня танка <=0
Ошибка C2280 "Tank &Tank::operator =(const Tank &)": предпринята попытка ссылки на удаленную функцию Хотя что танки, что снаряды созданы аналогично, одинаково переданы в функцию столкновений, у снарядов всё окей, а тут проблема. П.С Я сейчас не особо думаю об освобождении памяти, прочих вещах, понимаю, что в целом пока это всё не оптимально задумано, но мне бы пока просто протестировать разные аспекты игры. Так что пока мне надо решить проблему в данной реализации.
0
|
02.08.2017, 20:43 | |
Ответы с готовыми решениями:
10
Ошибка попытка ссылки на удаленную функцию Предпринята попытка ссылки на удаленную функцию Предпринята попытка ссылки на удаленную функцию C2280 "bulb &bulb::operator =(const bulb &)": предпринята попытка ссылки на удаленную функцию |
Модератор
13636 / 10857 / 6452
Регистрация: 18.12.2011
Сообщений: 28,939
|
||||||
02.08.2017, 21:16 | 2 | |||||
Так может у класса Tank не реализована функция
1
|
8 / 8 / 1
Регистрация: 13.07.2014
Сообщений: 365
|
|
02.08.2017, 21:44 [ТС] | 3 |
Мне просто не совсем понятно почему она нужна при удаление из вектора.
И самое главное, почему у класса Снаряда (а он создан идентично танку) при удалении элемента вектора такой проблемы нету...
0
|
1550 / 875 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
|
||||||
03.08.2017, 00:47 | 4 | |||||
Зачем
new ? Это утечка памяти.
0
|
Вездепух
12639 / 6546 / 1758
Регистрация: 18.10.2014
Сообщений: 16,509
|
|
03.08.2017, 00:56 | 5 |
Значит все таки не аналогично. Но телепатов тут нет и что у вас там понаписано в снарядах и танках - неизвестно.
Как это "почему"? При удалении элемента из вектора необходимо передвигать оставшиеся элементы, чтобы закрыть "дырку". Вот тут-то и может понадобиться оператор присваивания. P.S. С new действительно написана ярко выраженная белиберда, приводящая лишь к утечке памяти.
0
|
19405 / 10024 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
03.08.2017, 01:34 | 6 | |||||
Надо увидеть объявления обоих классов, где-то в них есть разница, которая так влияет.
Оператор= может быть недоступен по нескольким причинам, например, константы в качестве данных-членов или ссылки могут к этому привести. Смотреть надо объявления твоих классов. Если, например, у класса есть константы в качестве данных-членов, то компилятор не предоставляет оператор присваивания по умолчанию, т.к. константам нельзя присваивать (по умолчанию выполняется почленное присваивание для всех data members). Если тебе все-таки нужен оператор присваивания в таком классе, его нужно сделать самостоятельно. Оно не "неоптимально", оно просто неверно. Зачем нужно было создавать вообще объект динамически, чтобы потом его по значению положить в вектор? Все же проще гораздо. И без утечек памяти.
Описанный порядок лишь упрощенный пример того, как может выполняться актуализация данных в векторе после выполнения удаления из середины. В реальности, скорее всего, будет выполнено три присваивания, а деструктор вызовется у бывшего последнего элемента, после присваивания его предпоследнему (в первом варианте пришлось бы вызывать два деструктора: для удаляемого элемента, и для "лишнего" бывшего последнего). А если у данных вектора доступно перемещение (move-assignment), то будет задействовано оно, а не присваивание. Это не меняет сути, впрочем. Будь то копирование, присваивание или перемещение - они будут вызываться при некоторых операциях с вектором, удалении не с конца, добавлении элементов, операции изменения размера и т.п.
0
|
8 / 8 / 1
Регистрация: 13.07.2014
Сообщений: 365
|
|||||||||||||||||||||
03.08.2017, 09:14 [ТС] | 7 | ||||||||||||||||||||
Ого, спасибо. Много дельных замечаний.
Ну что же, приведу h. классов. Снаряды:
Операцию new я уже убрал при создании этих объектов. А вот про конструктор копирования (или оператор присваивания) я понял логику. Правда пока осталось тайной почему Снаряд на это не жаловался ( Bomb_all.erase(Bomb_all.begin() + i); ), но в целом понял сам смысл. Хотя упоминается это чаще всего в тех случаях когда объекты создаются динамически. Но в моём случае удаления из вектора элемента, это получается всё равно актуально. Признаться никогда ещё не пользовался констр. копирования и т.д. Не буду наглеть как это проще всего реализовать, погуглю... Добавлено через 16 секунд Ого, спасибо. Много дельных замечаний. Ну что же, приведу h. классов. Снаряды:
Операцию new я уже убрал при создании этих объектов. А вот про конструктор копирования (или оператор присваивания) я понял логику. Правда пока осталось тайной почему Снаряд на это не жаловался ( Bomb_all.erase(Bomb_all.begin() + i); ), но в целом понял сам смысл. Хотя упоминается это чаще всего в тех случаях когда объекты создаются динамически. Но в моём случае удаления из вектора элемента, это получается всё равно актуально. Признаться никогда ещё не пользовался констр. копирования и т.д. Не буду наглеть как это проще всего реализовать, погуглю...
0
|
19405 / 10024 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
03.08.2017, 11:37 | 8 | |||||
Сообщение было отмечено Masai как решение
Решение
Как я и говорил, собственно, оператор присваивания помечен как deleted из-за этих двух строк.
Как видно из кода, эти константы не предполагаются к использованию с разной инициализацией от экземпляра к экземпляру, следовательно нет никакого резона оставлять их нестатическими данными-членами. Сделай их статическими, constexpr значениями и проблема исчезнет.
Ну почему тайной-то? Я же написал о возможных причинах в посте #6. Должно же было как-то насторожить?
1
|
8 / 8 / 1
Регистрация: 13.07.2014
Сообщений: 365
|
|
03.08.2017, 11:38 [ТС] | 9 |
DrOffset, огромное спасибо!!! Это сразу решило все проблемы!
1) Я понял почему неурядица была лишь в классе танка, а не в аналогичном снаряде. 2) Собственно всё заработало! Сам бы я не докопался бы до такого нюанса... Я что-то совсем забыл просто про те 2 члена...Класс разросся, как-то эта деталь совсем уплыла от меня. Ну и выше мне верно подсказали не делать динамическими объекты.
0
|
8 / 8 / 1
Регистрация: 13.07.2014
Сообщений: 365
|
|
05.08.2017, 14:48 [ТС] | 10 |
Господа, а у вас нет идей как сделать в sfml тексту окантовку? Скажем, красный текст и в чёрной окантовочке. Так было бы намного симпатичней.
Вообще признателен форумчанам, благодаря вам я преодолеваю трудности.
0
|
Любитель чаепитий
|
|
05.08.2017, 16:04 | 11 |
0
|
05.08.2017, 16:04 | |
05.08.2017, 16:04 | |
Помогаю со студенческими работами здесь
11
Предпринята попытка ссылки на удаленную функцию Ошибка, попытка вызвать функцию Ошибка С2280 при попытке создания потока Попытка вызвать процедуру, как функцию Попытка вызвать процедуру как функцию Попытка вызвать процедуру как функцию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |