Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/43: Рейтинг темы: голосов - 43, средняя оценка - 4.88
 Аватар для Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65

Как создавать массивы объектов, и как к ним обращаться?

10.08.2008, 22:12. Показов 9998. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как создавать массивы объектов и как к ним обращаться?

вот что пишет создатель самого си в своей книге -
5.5.5 Массивы объектов класса
Чтобы можно было описать массив объектов класса с конструктором, этот класс должен иметь стандартный конструктор, т.е. конструктор, вызываемый без параметров. Например, в соответствии с определением
C++
1
 table tbl[10];
будет создан массив из 10 таблиц, каждая из которых инициализируется вызовом table::table(15), поскольку вызов table::table() будет происходить с фактическим параметром 15.
В описании массива объектов не предусмотрено возможности указать параметры для конструктора. Если члены массива обязательно надо инициализировать разными значениями, то начинаются трюки с глобальными или статическими членами. Когда уничтожается массив, деструктор должен вызываться для каждого элемента массива. Для массивов, которые размещаются не с помощью new, это делается неявно. Однако для размещенных в свободной памяти массивов неявно вызывать деструктор нельзя, поскольку транслятор не отличит указатель на отдельный объект массива от указателя на начало массива, например:
C++
1
2
3
4
5
6
7
8
void f()
{
 table* t1 = new table;
 table* t2 = new table[10];
 delete t1; // удаляется одна таблица
 delete t2; // неприятность:
 // на самом деле удаляется 10 таблиц
}
В данном случае программист должен указать, что t2 - указатель на массив:
C++
1
2
3
4
5
6
7
void g(int sz)
{
 table* t1 = new table;
 table* t2 = new table[sz];
 delete t1;
 delete[] t2;
}
Функция размещения хранит число элементов для каждого размещаемого массива. Требование использовать для удаления массивов только операцию delete[] освобождает функцию размещения от обязанности хранить счетчики
числа элементов для каждого массива. Исполнение такой обязанности в реализациях С++ вызывало бы существенные потери времени и памяти и нарушило совместимость с С.
получается что нельзя создавать массивы объектов если в классе не стандартный деструктор!!!!
а как обращаться к созданным объектам в массиве? мне не понятно.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2008, 22:12
Ответы с готовыми решениями:

Как создать массив объектов одного класса в другом, и как к ним обращаться?
вот класс: #include <iostream> #include <string.h> using namespace std; class File {...

Как обращаться к методу динамически созданного объекта?
Тоесть как правильно: string *str = new string(); *str->size(); // или str->size();

Как обращаться к динамически созданным объектам
Доброго времени суток. Возникла следующая необходимость, создать указанное кол-во динамических...

11
 Аватар для Spo1ler
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
10.08.2008, 22:35
вот так
(t[1]).f();
или нет?
лучше конечно наверное сделать массив указателей на обьекты, тогда (t[i])->f();
а деструкторы вроде бы лучше объявлять так
Code
1
2
3
virtual ~SomeClass(){
 
}
гуру поправьте меня если я не прав, сам в принципе новичок
0
 Аватар для Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
10.08.2008, 22:51  [ТС]
напиши пожалуйста пример я новичок в этом деле и мне сложно воспринимать так (без примеров)
напиши какойнибудь пример(в том числе с указателемя)
я пытался так:
C++
1
2
3
    neyro* t;
    t[1] = new neyro("0.txt");
    t[1]->saveset("00.txt");
не получается

Добавлено через 2 минуты
Code
1
2
3
 neyro* t[3];
    t[1] = new neyro("0.txt");
    t[1]->saveset("00.txt");
а так получилось))))))
объясните пожалуйста что я сделал?
0
 Аватар для Spo1ler
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
10.08.2008, 23:32
somep->somefunc() это тоже самое что (*p).somefunc()
так что вы использовли не то,если вам надо получить доступ к члену обьекта, то используте синтаксис someObj.somemember; -> же создан для указателей на функции и данныйе члены
0
 Аватар для Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
10.08.2008, 23:37  [ТС]
Цитата Сообщение от Spo1ler Посмотреть сообщение
somep->somefunc() это тоже самое что (*p).somefunc()
так что вы использовли не то,если вам надо получить доступ к члену обьекта, то используте синтаксис someObj.somemember; -> же создан для указателей на функции и данныйе члены
ммм если я не то использовал почему у меня получилось?
и синтаксис совсе не такой как уСтрауструпа
0
 Аватар для Spo1ler
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
10.08.2008, 23:47
эм, во общем можно мне брифинг? а то я запутался как там у вас получалось, а как нет
0
 Аватар для Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
10.08.2008, 23:54  [ТС]
я не знаю что такое брифинг(((((
C++
1
2
3
neyro* t[3];
    t[1] = new neyro("0.txt");
    t[1]->saveset("00.txt");
так получилось
0
Эксперт С++
 Аватар для XuTPbIu_MuHTAu
2256 / 771 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
10.08.2008, 23:58
Насколько я понял,суть проблемы в инициализации отдельных элементов массива,собранного из объектов класса? То,что есть конструкторы,не значит,что инициализация возможна только ими. Напишите функцию для инициализации - и проблемы уже нет. Вообще,как я вижу себе конструкторы не-по-умолчанию, их область использования не очень велика. Имеет смысл их использовать в таких ситуациях :

скажем,есть класс,например, VECTOR3D. и есть функция,которая делает так:
float length(VECTOR3D & v); А у вас есть три числа : float x,float y,float z; Тогда напрашивается такой вызов : length( VECTOR3D(x,y,z)); Пример притянут за уши,но мысль ясна.
Вот пример работы с массивом объектов :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include < stdio.h>
#include <conio.h>
class someClass {
private : 
    int someNumber;
public:
    someClass() { someNumber=0;};
    void initNumber(int number) { someNumber=number;};
    void showNumber() { printf("%d",someNumber); };
};
int main () {
    someClass* someArray = new someClass[10];;
    for(int i=0;i<10;i++) someArray[i].showNumber();
    printf("\n");
    for(i=0;i<10;i++) someArray[i].initNumber(i);
    for( i=0;i<10;i++) someArray[i].showNumber();
    getch();
    return 0;
};
1
 Аватар для Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
11.08.2008, 00:07  [ТС]
спасибо за пример)))) всё становиться понятным
0
7 / 7 / 0
Регистрация: 07.08.2008
Сообщений: 22
13.08.2008, 15:22
Чисто это, для прояснения ситуации
neyro * t - указатель на один объект
neyro * t[10] оно же neyro ** t - указатель на массив указателей
1
 Аватар для Spo1ler
296 / 56 / 5
Регистрация: 22.05.2008
Сообщений: 788
13.08.2008, 21:59
указатель на первый элемент массива вообщето
0
7 / 7 / 0
Регистрация: 07.08.2008
Сообщений: 22
14.08.2008, 09:40
Согласен, и это тоже
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.08.2008, 09:40
Помогаю со студенческими работами здесь

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

Std::thread. Почему можно обращаться к приватным членам объекта в другом потоке?
#include &lt;iostream&gt; #include &lt;thread&gt; #include &lt;mutex&gt; #include &lt;iomanip&gt; using namespace std;...

Почему допустимо создавать объект по другому объекту, но нельзя присваивать уже созданный объект, другому созданному объекту?
Это можно : Array a(10); a.set(0,5); Array b(a); А это нельзя : Array a(10); Array b(20);...

Найти минимальный элемент массива (через указатели, запрещено обращаться к элементам массива по индексам)
Написать программу, создающую массив из 10 случайных целых чисел из отрезка . Вывести на...

Как обращаться к элементам двумерного массива?
У меня та же ошибка в программе #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #define...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru