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

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

10.08.2008, 22:12. Показов 3160. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.08.2008, 22:12
Ответы с готовыми решениями:

Как создавать новые экземпляры класса и как к ним обращаться?
создал класс Public Class book Public Property strname As String Public Property...

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

Как отслеживать открыто ли какое либо дочернее окно MDI и как к ним обращаться?
Как отслеживать открыто ли какое либо дочернее окно MDI и как к ним обращаться? и в нете никак не...

Пользовательский тип данных: как к ним обращаться
Вечер добрый! нужна помощьс пользовательским типом данных я обьявила: Type Record Cod As...

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

}
гуру поправьте меня если я не прав, сам в принципе новичок
0
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
295 / 55 / 5
Регистрация: 22.05.2008
Сообщений: 788
10.08.2008, 23:32 4
somep->somefunc() это тоже самое что (*p).somefunc()
так что вы использовли не то,если вам надо получить доступ к члену обьекта, то используте синтаксис someObj.somemember; -> же создан для указателей на функции и данныйе члены
0
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
10.08.2008, 23:37  [ТС] 5
Цитата Сообщение от Spo1ler Посмотреть сообщение
somep->somefunc() это тоже самое что (*p).somefunc()
так что вы использовли не то,если вам надо получить доступ к члену обьекта, то используте синтаксис someObj.somemember; -> же создан для указателей на функции и данныйе члены
ммм если я не то использовал почему у меня получилось?
и синтаксис совсе не такой как уСтрауструпа
0
295 / 55 / 5
Регистрация: 22.05.2008
Сообщений: 788
10.08.2008, 23:47 6
эм, во общем можно мне брифинг? а то я запутался как там у вас получалось, а как нет
0
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
Эксперт С++
2250 / 765 / 25
Регистрация: 27.05.2008
Сообщений: 1,496
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
1 / 1 / 0
Регистрация: 10.08.2008
Сообщений: 65
11.08.2008, 00:07  [ТС] 9
спасибо за пример)))) всё становиться понятным
0
7 / 7 / 0
Регистрация: 07.08.2008
Сообщений: 22
13.08.2008, 15:22 10
Чисто это, для прояснения ситуации
neyro * t - указатель на один объект
neyro * t[10] оно же neyro ** t - указатель на массив указателей
1
295 / 55 / 5
Регистрация: 22.05.2008
Сообщений: 788
13.08.2008, 21:59 11
указатель на первый элемент массива вообщето
0
7 / 7 / 0
Регистрация: 07.08.2008
Сообщений: 22
14.08.2008, 09:40 12
Согласен, и это тоже
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.08.2008, 09:40

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как создать базу данных на сайте, и обращаться к ним?
Допустим, у меня есть сайт. Я хочу создать на нём базу данных. Эта база будет состоять из списка...

Как создать много матриц, а потом к ним обращаться отдельно
как создать много матриц а потом к ним обращаться отдельно в matlab.

Как оформить поля, чтобы к ним можно было обращаться из других классов?
Подскажите Вот у меня имеется код: Код C# public static double matrix; public static...

Как в Xpages обращаться к свойствам объектов
Как при нажатии на button установить свойство Visible объекта Panel или Custom Control равным false...

Можно ли создавать массивы объектов?
Можно ли создавать массивы объектов?

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


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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