Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.73
Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
#1

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

10.08.2008, 22:12. Просмотров 2866. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2008, 22:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создавать массивы объектов, и как к ним обращаться? (C++):

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

как создавать динамическое число объектов - C++
Помогите: как создавать динамическое число объектов, напишите, пожалуйста программу, в которой создается N объектов

как создать вектор из векторов и как потом к нему обращаться? - C++
Банальный вопрос - как создать вектор из векторов и как потом к нему обращаться? вот vector<int> a; - это, понятное дело, вектор а, а вот...

Как обращаться с функциями? - C++
Начиная от цикла (от места, где начинается непосредственно работа со строками) завернуть в функцию. И ещё, может кто посоветует как через...

Как обращаться к Union - C++
Создал указатель на структуру Person в 19 строчке. Как обратиться к полю Union'a? Некорректное обращение к union в 30, 34, 38, 49, 56,...

Почему не стоит создавать массив объектов? - C++
Нам преподаватель сказал, что создавать массив объектов лучше не стоит(надо создавать массив указателей на объекты) так как при...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
10.08.2008, 22:35 #2
вот так
(t[1]).f();
или нет?
лучше конечно наверное сделать массив указателей на обьекты, тогда (t[i])->f();
а деструкторы вроде бы лучше объявлять так
Код
virtual ~SomeClass(){

}
гуру поправьте меня если я не прав, сам в принципе новичок
0
Beliy_shum
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
10.08.2008, 22:51  [ТС] #3
напиши пожалуйста пример я новичок в этом деле и мне сложно воспринимать так (без примеров)
напиши какойнибудь пример(в том числе с указателемя)
я пытался так:
C++
1
2
3
    neyro* t;
    t[1] = new neyro("0.txt");
    t[1]->saveset("00.txt");
не получается

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

скажем,есть класс,например, 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  [ТС] #9
спасибо за пример)))) всё становиться понятным
0
urkovsky
6 / 6 / 0
Регистрация: 07.08.2008
Сообщений: 22
13.08.2008, 15:22 #10
Чисто это, для прояснения ситуации
neyro * t - указатель на один объект
neyro * t[10] оно же neyro ** t - указатель на массив указателей
1
Spo1ler
292 / 52 / 3
Регистрация: 22.05.2008
Сообщений: 788
13.08.2008, 21:59 #11
указатель на первый элемент массива вообщето
0
urkovsky
6 / 6 / 0
Регистрация: 07.08.2008
Сообщений: 22
14.08.2008, 09:40 #12
Согласен, и это тоже
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.08.2008, 09:40
Привет! Вот еще темы с ответами:

Как обращаться к вектору из структуры - C++
Я записала в вектор структуру: struct Sotrudnic { char surname, name, patronymic, propiska, pol, status; int passport, age,...

Как правильно обращаться к функциям - C++
Всем Привет! Решил заняться с++, но попал в ступор. вообще я занимаюсь программированием на AS2(flash), язык по синтаксису схож с...

Как узнать и прочитать файл до того как с ним начнет работать другая программа - C++
Здрувствуйте! Подскажите пожалуйста, как я могу узнать и прочитать файл до того как с ним начнет работать другая программа. Например ...

Как получить доступ к элементам массива работая с ним как с указателем и адресной арифметикой - C++
int array = { {1,2,3}, {1,2},{1,2,3,4}, {1,2,3,4},{1,2,},}; for(int i = 0; i &lt; 25; i++) printf(&quot;%d &quot;, array); ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
14.08.2008, 09:40
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru