Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/64: Рейтинг темы: голосов - 64, средняя оценка - 4.64
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45

Как добавить объект в массив объектов?

04.09.2015, 22:46. Показов 12789. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Начинающий, камнями прошу не кидаться

Как создать динамический массив объектов я уже понял, а вот как добавить еще один элемент к уже существующему массиву я не понял. А так же как сочетать динамический массив объектов с конструктором класса и как добавить новый элемент к массиву?
см. комменты в коде...

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
#include <iostream> // Стандартный набор
#include <cstdlib> // либра для консоли
#include <string> // либра для system
 
class del
{
public:
    // Методы
    ~del() {} // Деструктор класса 
 
    del (int tt)    // Конструктор класса.
    {
        t = tt;     //t - индивидуальное число
    }
 
    // Переменные
    int t; //t - индивидуальное число
};
 
int main()
{
    // Переменные
    int c_i = 0; // номер в массиве
    int ttt = 2; // Число для объекта
    // Действие
    c_i = 1; 
    del* s = new del[c_i](ttt); // Пытаюсь сделать динамический массив объектов и воспользоваться конструктором, но не дает пользоваться конструктором.
    cout << s[0].t << endl; // Должен показать значение t (индивидуального числа объекта) объекта 0
    ttt += 3;   // теперь ttt = 5
    c_i += 1;   // теперь c_i = 2
    del* s = new del[c_i](ttt); // Попытка добавить еще один элемент в массив и новому элементу присвоить знч. индивидуального числа = 5
    cout << s[1].t << endl; // Должен показать значение t (индивидуального числа объекта) объекта 1
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2015, 22:46
Ответы с готовыми решениями:

Как занести в объект массив объектов дргуго класса
Толком не знаю чего хочу и нагуглить не получилось Задача у меня такая: Объект класса №1 это ( число, массив объектов класса №2) ...

Как добавить объект в массив, из другого скрипта?
Делаю в игре &quot;реалистичный&quot; магазин. Есть 2 скрипта, 1 - &quot;чек&quot;, он на кассе и на него нужно нажать, тогда из переменной GameObject , все...

Как с json сериализовать объект, в которой вложена коллекция или массив других объектов
public class Example{ private List&lt;NestedExample&gt; list; public Example(List&lt;NestedExample&gt; list) { setList(list); ...

13
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
04.09.2015, 23:41
чтобы создать такой массив - у объекта должен быть конструктор без аргументов. иначе никак.
добавить в уже выделенным массив еще один объект не выйдет. нужно создать новый, скопировать из старого в новый то, что там было и после этого в конец закопировать тот объект, которым вы хотели расширить массив.
ну и если цель - не научится таким лоулевел вещам, а именно динамические массивы поюзать - смотрите в сторону контейнеров, в частности std::vector. там все уже придумано и сделано
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.09.2015, 23:48
Цитата Сообщение от Perfilov Посмотреть сообщение
иначе никак.

тут на форуме есть куча примеров, как сделать "так".
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
04.09.2015, 23:48
Цитата Сообщение от babanty Посмотреть сообщение
Как создать динамический массив объектов я уже понял, а вот как добавить еще один элемент к уже существующему массиву я не понял.
Вы ничего не поняли.
Цитата Сообщение от babanty Посмотреть сообщение
как добавить новый элемент к массиву?
По сути никак.
На практике созданием нового массива большего размера(с резервированием) и копированием туда элементов.

Также смотри реализацию std::vector<>
2
265 / 165 / 56
Регистрация: 25.02.2015
Сообщений: 435
04.09.2015, 23:54
ну не будем же мы рассказывать человеку у которого такие вопросы о том, как сделать массив объектов, у которых нет конструктора без аргументов. создание обычного массива требует наличие дефолтного конструктора у объектов. а тут ТС еще захотел чтобы в массиве указателей у объектов конструкторы повызывались. В общем в такие детали рано еще посвящать.
0
Эксперт PHP
 Аватар для Kerry_Jr
3106 / 2591 / 1219
Регистрация: 14.05.2014
Сообщений: 7,236
Записей в блоге: 1
04.09.2015, 23:57
babanty, у Вас память чуть чуть потекла бы (если б код работал), а в качестве динамического массива лучше vector использовать.
1
56 / 50 / 22
Регистрация: 17.03.2014
Сообщений: 143
05.09.2015, 01:11
Лучший ответ Сообщение было отмечено babanty как решение

Решение

Вы можете удалить старый массив и перенаправить указатель на новый.
Пример на базовом типе данных:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    int size = 10;
    int *arr = new int[size], *dummy = nullptr;
    // использование массива
    for (int i = 0; i < size; i++)
        arr[i] = i * 2;
    //...
    //...
    dummy = new int[size+1];
    for (int i = 0; i < size; i++)
        dummy[i] = arr[i];
    delete [] arr;
    size++;
    arr = new int[size];
    arr = dummy;
    for (int i = 0; i < size; i++)
        arr[i] = dummy[i];

А вообще люди дело говорят, используйте vector
1
1 / 1 / 1
Регистрация: 13.08.2015
Сообщений: 45
05.09.2015, 11:55  [ТС]
Всем спасибо
О данных ограничениях с конструктором я знал, но думал что их как то можно обойти без сильных ресурсозатрат так же как и с добавлением нового элемента в массив. Вектор самое то для решения второй задачи по добавлению нового элемента, еще раз спасибо
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
05.09.2015, 12:18
Цитата Сообщение от babanty Посмотреть сообщение
так же как и с добавлением нового элемента в массив.
Еще раз: массивы в С++ не расширяемые.
0
0 / 0 / 0
Регистрация: 28.08.2016
Сообщений: 3
28.08.2016, 13:36
Цитата Сообщение от Avazart Посмотреть сообщение
Еще раз: массивы в С++ не расширяемые.
Да кто вам это сказал?! массивы в С++ - это указатель на данные, а вовсе не сами данные. Соответственно и работать с массивом нужно как с указателем, а не с данными. Как доказательство - даже такой безумный код, где вдобавок вообще нет никаких массивов(память сама по себе один большой массив), отработает правильно, и выведет всё верно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int _tmain(int argc, _TCHAR* argv[])
{
    int *x,*y;
    x=new int;
    *(x)=15;
    *(x+1)=26;
    *(x+2)=37;
    y=x;
    *(y+3)=48;
    *(x+4)=59;
    for (int i = 0; i < 5; i++) std::cout<<y[i]<<" ";   
    system("pause");
    return 0;
}
Другой вопрос, что с++ это не асм, и работать с памятью без предварительного её выделения нельзя - для этого есть new, malloc и realloc. Так что код babanty должен был выглядеть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int main()
{
    // Переменные
    int c_i = 0; // номер в массиве
    int ttt = 2; // Число для объекта    
    // Действие
    c_i = 1; 
    del *s=(del*)malloc(sizeof(del)*c_i);//выделяем память под массив объектов класса del количеством c_i
    new(&s[c_i-1])del(ttt); //выделяем память для объекта по ссылке на s[c_i] с вызовом конструктора класса
    std::cout << s[0].t << std::endl; // Должен показать значение t (индивидуального числа объекта) объекта 0
    ttt += 3;   // теперь ttt = 5
    c_i += 1;   // теперь c_i = 2
    s =(del*)realloc(s,sizeof(del)*c_i);//перевыделяем память 
    new(&s[c_i-1])del(ttt); 
    std::cout << s[1].t << std::endl; // Должен показать значение t (индивидуального числа объекта) объекта 1
    system("pause");
    return 0;
}
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
28.08.2016, 13:59
Цитата Сообщение от Random_value Посмотреть сообщение
массивы в С++ - это указатель на данные
Массив это массив, а указатель это указатель не нужно мешать одно с другим.
Другое дело что имя массива неявно приводится к указателю на первый элемент.
Цитата Сообщение от Random_value Посмотреть сообщение
отработает правильно, и выведет всё верно:
Не правильно: нарушение памяти, утечка памяти.
0
0 / 0 / 0
Регистрация: 28.08.2016
Сообщений: 3
28.08.2016, 15:17
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от Random_value
массивы в С++ - это указатель на данные
Массив это массив, а указатель это указатель не нужно мешать одно с другим.
Другое дело что имя массива неявно приводится к указателю на первый элемент.
Никто и не путает, но уточню для верности - сам массив это участок в памяти, к которому в С++ обращаются по указателю на его первый элемент. Смысл от этого не меняется - работаем с памятью мы именно через указатель. И размер памяти выделенной по этому указателю менять вполне возможно с помощью realloc.
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от Random_value
отработает правильно, и выведет всё верно:
Не правильно: нарушение памяти, утечка памяти.
Если не пытаться потом использовать delete - то версия debug нарушения не вызовет. На утечки не проверял - вполне возможно будут. Но до завершения программы и очистки памяти она отработает вполне корректно - большего мне от неё и не требовалось. А вот relese будет крашится наверняка.
Я привёл это код просто чтобы наглядно показать - данные и указатели на них не одно и то же, и гонять туда сюда данные не имеет никакого смысла, нужно лишь изменить указатель, выделив по нему больше памяти.
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
28.08.2016, 17:18
Цитата Сообщение от Avazart Посмотреть сообщение
Еще раз: массивы в С++ не расширяемые.
Все правильно. Под массивом имеется в виду
C++
1
2
3
4
5
6
int a[100]; // Здесь 100 элементов, сделать чтоб стало 200 мы не сможем
int *a = new int[100];
/*Можно конечно использовать указатели 
и при необходимости выделить новый кусок памяти, 
скопировать из старого, а старый освободить, 
но это не массив(с точки зрения типов С++), а указатель на int*/
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,428
28.08.2016, 17:37
Липпман "Язык программирования С++. Базовый курс".
Миниатюры
Как добавить объект в массив объектов?   Как добавить объект в массив объектов?   Как добавить объект в массив объектов?  

2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.08.2016, 17:37
Помогаю со студенческими работами здесь

Добавить массив объектов в класс
Задан у меня какой-то класс P. Задаю новый класс R, в нем массив объектов класса Р. class R { private P pl;

Добавить новый элемент в массив объектов
Есть следующий массив, как в него добавить новый элемент? var test = ;

Создать массив не менее чем из 7 объектов и найти в этом массиве объект по названию(и по свойствам)
Создать массив не менее чем из 7 объектов и найти в этом массиве объект по названию(и по свойствам) Чекните код package laba10; ...

Создать массив не менее чем из 7 объектов и найти в этом массиве объект по названию(и по свойствам)
Создать массив не менее чем из 7 объектов и найти в этом массиве объект по названию(и по свойствам)

Добавить массив объектов ссылочного типа в класс
Задан у меня какой-то класс P. Задаю новый класс R, в нем массив объектов класса Р. class R { private P pl; int c; ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определенном условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru