|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
||||||||||||||||
Std::vector добавить новый элемент собственного класса без использования конструктора копирования11.11.2014, 21:26. Показов 11546. Ответов 29
Метки нет (Все метки)
Всем привет!
Есть один класс, который я хочу хранить в std::vector. Создать массив, с типом своего класса, грубо говоря. Естественно, сначала попробовал такое:
Я попробовал так:
Третья попытка:
1) Что нужно передать функции push_back, чтобы создать новый элемент? 2) Можно ли как то обойти ограничение на обязательное наличие конструктора копирования, при использовании std::vector? Буду благодарен за помощь =)
0
|
||||||||||||||||
| 11.11.2014, 21:26 | |
|
Ответы с готовыми решениями:
29
Emplace в std::map. Как добавить элемент в std::map без копирования? Добавить элемент на n-e место в std::vector
|
|
Модератор
13769 / 10962 / 6491
Регистрация: 18.12.2011
Сообщений: 29,236
|
||||||
| 11.11.2014, 21:36 | ||||||
|
А так почему нельзя?
2
|
||||||
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
|||||||
| 11.11.2014, 21:48 | |||||||
|
Выражение 'T()' в языке С++ создает инициализированный временный объект типа 'T' . В вашем случае этот объект будет инициализироваться вызовом конструктора по умолчанию. Далее этот временный объект будет скопирован в вектор вызовом конструктора копирования. Именно поэтому вам нужен конструктор копирования. Как ни вертитесь, при таком методе добавления объекта вы обязаны иметь в классе конструктор копирования. (В С++11 тут также будет работать move-конструктор, но это отдельная песня). Тут скорее возникает вопрос, каким образом вы умудрились остаться без этого конструктора. Конструктор копирования обычно неявно генерируется компилятором. Если у вас его нет, это значит, что в вашем классе понаписано что-то такое, что предотвратило создание нормального конструктора копирования. Вы часом не умудрились написать конструктор копирования руками с неконстантной ссылкой в качестве параметра? Или вы сделали его private? Если в классе по какой-то уважительной причине все таки нет доступного конструктора копирования, то создать объект в векторе таки можно в С++ при помощи методов группы 'emplace'. В данном случае
1
|
|||||||
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|
| 11.11.2014, 21:49 [ТС] | |
|
Думал об этом, но выглядит уродливо...
0
|
|
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
||
| 11.11.2014, 21:52 | ||
|
1
|
||
|
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
|
|
| 11.11.2014, 21:58 | |
|
0
|
|
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
||||
| 11.11.2014, 22:17 [ТС] | ||||
|
Спасибо большое за совет с emplace! Я его пробовал, но тоже передавал параметры, поэтому были те же самые проблемы! Сейчас попробую!
P.S. Ради интереса, напишу почему нет К.К. Дело в том, что я в классе использую указатель на объект в видеопамяти. Эта память мне выделяется, грубо говоря, фабрикой. И манипулировать я могу только адресом на эту память. Не хотел связываться с К.К. вообще, чтобы не плодить множественные ссылки на одну и ту же область памяти. А прописывать заново выделение памяти, это гигантский гемор, который планировал сделать в самом конце (когда класс будет дописан полностью). Добавлено через 1 минуту Добавлено через 1 минуту Добавлено через 5 минут
0
|
||||
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
|||
| 11.11.2014, 22:25 | |||
|
В такой ситуации в С++ вам следовало бы сделать ваш класс перемещаемым (movable), т.е. определить перемещающий конструктор и оператор присваивания. Тогда вы сможете пользоваться 'push_back' и 'std::move'. Ну и по-прежнему у вас есть 'emplace'. Добавлено через 1 минуту
2
|
|||
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
||
| 11.11.2014, 22:45 [ТС] | ||
|
Да, я пока не перешел на 11 стандарт... думал, что это пока не нужно.
0
|
||
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
||
| 11.11.2014, 22:52 | ||
|
1
|
||
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
|||||||
| 11.11.2014, 22:55 [ТС] | |||||||
|
Но в моем случае использование указателей вместо объектов приведет к кошмару, я решил воспользоваться уродливым вариантом:
0
|
|||||||
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
|||||||||||||
| 11.11.2014, 22:58 | |||||||||||||
1
|
|||||||||||||
|
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
|
|
| 12.11.2014, 00:10 | |
|
0
|
|
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
||
| 12.11.2014, 00:13 [ТС] | ||
|
Прошу прощения, одно маленькое замечание: вместо push_back, я использовал emplace_back...
И да, так работает, кроме того, я даже проверил, что объекты создаются правильно, так что сомнений нет. Добавлено через 2 минуты Но это не так (или мы чего-то не знаем) и эта первая строчка выглядит, хм, весьма некрасиво!
0
|
||
|
941 / 869 / 355
Регистрация: 10.10.2012
Сообщений: 2,706
|
||
| 12.11.2014, 00:26 | ||
|
Добавлено через 2 минуты
0
|
||
|
Вездепух
12923 / 6790 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
||
| 12.11.2014, 00:33 | ||
|
А, кажется въехал. Если конструктор копирования есть, но объявлен с параметром-неконстатной ссылкой, то тогда действительно будет именно так. Т.е. конструктор копирования вы таки написали. Но тогда возникает вопрос: почему ваш конструктор копирования объявлен с параметром-неконстатной ссылкой? И вы вроде говорили, что не хотели возиться с копированием таких объектов. Что же тогда делает конструктор копирования? Можно на него взглянуть?
1
|
||
| 12.11.2014, 01:00 | |
|
0
|
|
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|||||||
| 12.11.2014, 11:19 | |||||||
1
|
|||||||
|
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
|
||||||||||||||||||
| 12.11.2014, 14:30 [ТС] | ||||||||||||||||||
|
Мы создаем локальный объект
Подозрения справедливы? Добавлено через 3 минуты Например, мне скоро понадобится удалить последний элемент из вектора vec. Я пишу: vec.pop_back(). После этого, я не смогу написать вот так:
0
|
||||||||||||||||||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|||||||
| 12.11.2014, 15:11 | |||||||
1
|
|||||||
| 12.11.2014, 15:11 | |
|
Помогаю со студенческими работами здесь
20
Реализация класса MyString. Стандартная библиотека, std::string, std::vector Все случаи использования конструктора копирования Передача функции указатель на элемент std::vector<std::string> Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|