|
|
  |
Тонкости С++, Конструирование массива объектов |
|
|
|
Nov 12 2007, 12:27
|
Частый гость
 
Группа: Новичок
Сообщений: 84
Регистрация: 4-09-07
Из: Москва
Пользователь №: 30 277

|
Цитата(oran-be @ Nov 12 2007, 15:06)  Такой вопрос - есть объект в виде задекларированного класса. Необходимо иметь массив такого типа объектов. Как правильно сконструировать массив? есть подозрение, что опрерация OBJECT* pObject = (OBJECT*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OBJECT)*SIZE_AREA_OBJECTS); приведет лишь к конструированию только первого объекта и последующий вызов
pObject[2]->ObjectFunction(a, b, c); приведет к сбою программы.
Так же и оператор new. Кто то знает подробно? Лучше сначала выделить массив под указатели на объекты класса, а затем в цикле выделить необходимое кол-во объектов и сохранить указатели в массиве. По завершению необходимо не забыть освободить как все объекты класса, так и массив указателей.
|
|
|
|
|
Nov 12 2007, 12:31
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
Цитата(oran-be @ Nov 12 2007, 18:06)  Такой вопрос - есть объект в виде задекларированного класса. Необходимо иметь массив такого типа объектов. Как правильно сконструировать массив? есть подозрение, что опрерация OBJECT* pObject = (OBJECT*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OBJECT)*SIZE_AREA_OBJECTS); приведет лишь к конструированию только первого объекта и последующий вызов
pObject[2]->ObjectFunction(a, b, c); приведет к сбою программы.
Так же и оператор new. Кто то знает подробно? Код class TSlon { ... };
TSlon *p = new TSlon[10];
...
delete[] p; Будет создан массив объектов. Естественно, каждый объект будет создан с помощью конструктора, как обычно.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Nov 21 2007, 14:56
|
Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621

|
Цитата(Juggernaught @ Nov 21 2007, 15:20)  Ни HeapAlloc, ни malloc, ни calloc никакие объекты не конструируют никогда - они тупо выделяют память заданного размера. Динамически конструирует ТОЛЬКО new! Спасибо за "ценное" замечание. но было бы странно требовать от С-шных функций, при условии, что С -не объектно-ориентированный язык, конструирования объектов.
|
|
|
|
|
Nov 21 2007, 15:38
|
Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621

|
Цитата(Oldring @ Nov 21 2007, 19:10)  Хм... Странно, конечно, но разве не именно вы написали про конструирование плюсового объекта сишной функцией в своем самом первом посте? Я как раз и выразил сомнение по этому поводу. Я просто не знал, как правильно воспользоватся опрератором new для создания массива объектов, кроме как создать цикл по конструированию объектов, что было бы несколько неэлегантно.
|
|
|
|
|
Nov 22 2007, 15:06
|

Участник

Группа: Новичок
Сообщений: 30
Регистрация: 1-03-06
Пользователь №: 14 839

|
Цитата есть подозрение, что опрерацияOBJECT* pObject = (OBJECT*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OBJECT)*SIZE_AREA_OBJECTS);приведет лишь к конструированию только первого объекта и последующий вызов Так вот "ценность" замечания как раз в том что конструирования даже первого объекта не произойдет.
|
|
|
|
|
Nov 27 2007, 06:45
|
Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621

|
Цитата(Juggernaught @ Nov 22 2007, 19:06)  Так вот "ценность" замечания как раз в том что конструирования даже первого объекта не произойдет. Вы буите удивлены, но происходит. Приведение указателя вызывает конструктор.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|