реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Тонкости С++, Конструирование массива объектов
oran-be
сообщение Nov 12 2007, 12:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Такой вопрос - есть объект в виде задекларированного класса. Необходимо иметь массив такого типа объектов. Как правильно сконструировать массив?
есть подозрение, что опрерация
OBJECT* pObject = (OBJECT*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OBJECT)*SIZE_AREA_OBJECTS);
приведет лишь к конструированию только первого объекта и последующий вызов

pObject[2]->ObjectFunction(a, b, c);
приведет к сбою программы.

Так же и оператор new. Кто то знает подробно?
Go to the top of the page
 
+Quote Post
Degun
сообщение Nov 12 2007, 12:27
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 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. Кто то знает подробно?

Лучше сначала выделить массив под указатели на объекты класса, а затем в цикле выделить необходимое кол-во объектов и сохранить указатели в массиве. По завершению необходимо не забыть освободить как все объекты класса, так и массив указателей.
Go to the top of the page
 
+Quote Post
dxp
сообщение Nov 12 2007, 12:31
Сообщение #3


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;

Будет создан массив объектов. Естественно, каждый объект будет создан с помощью конструктора, как обычно.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 12 2007, 14:49
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Спасибо за помосчь, даже несмотря на то, чтоя, похоже не втой ветке тему открыл. smile.gif
Go to the top of the page
 
+Quote Post
Juggernaught
сообщение Nov 21 2007, 11:20
Сообщение #5


Участник
*

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



Ни HeapAlloc, ни malloc, ни calloc никакие объекты не конструируют никогда - они тупо выделяют память заданного размера. Динамически конструирует ТОЛЬКО new!
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 21 2007, 14:56
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата(Juggernaught @ Nov 21 2007, 15:20) *
Ни HeapAlloc, ни malloc, ни calloc никакие объекты не конструируют никогда - они тупо выделяют память заданного размера. Динамически конструирует ТОЛЬКО new!

Спасибо за "ценное" замечание. но было бы странно требовать от С-шных функций, при условии, что С -не объектно-ориентированный язык, конструирования объектов.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Nov 21 2007, 15:10
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(oran-be @ Nov 21 2007, 17:56) *
Спасибо за "ценное" замечание. но было бы странно требовать от С-шных функций, при условии, что С -не объектно-ориентированный язык, конструирования объектов.


Хм... Странно, конечно, но разве не именно вы написали про конструирование плюсового объекта сишной функцией в своем самом первом посте?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 21 2007, 15:38
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата(Oldring @ Nov 21 2007, 19:10) *
Хм... Странно, конечно, но разве не именно вы написали про конструирование плюсового объекта сишной функцией в своем самом первом посте?

Я как раз и выразил сомнение по этому поводу. Я просто не знал, как правильно воспользоватся опрератором new для создания массива объектов, кроме как создать цикл по конструированию объектов, что было бы несколько неэлегантно.
Go to the top of the page
 
+Quote Post
Juggernaught
сообщение Nov 22 2007, 15:06
Сообщение #9


Участник
*

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



Цитата
есть подозрение, что опрерацияOBJECT* pObject = (OBJECT*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(OBJECT)*SIZE_AREA_OBJECTS);приведет лишь к конструированию только первого объекта и последующий вызов


Так вот "ценность" замечания как раз в том что конструирования даже первого объекта не произойдет.
Go to the top of the page
 
+Quote Post
oran-be
сообщение Nov 27 2007, 06:45
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 234
Регистрация: 30-03-07
Из: Одесса
Пользователь №: 26 621



Цитата(Juggernaught @ Nov 22 2007, 19:06) *
Так вот "ценность" замечания как раз в том что конструирования даже первого объекта не произойдет.

Вы буите удивлены, но происходит. Приведение указателя вызывает конструктор.
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 27 2007, 08:11
Сообщение #11


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(oran-be @ Nov 27 2007, 09:45) *
Вы буите удивлены, но происходит. Приведение указателя вызывает конструктор.

Для прояснения вопроса.
http://electronix.ru/forum/index.php?showt...6835&st=22#
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 21:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016