Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Инициализация константных полей 
:(
    Опции темы
mes
Дата 9.8.2008, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(yep @  9.8.2008,  00:15 Найти цитируемый пост)
о здесь является заоблачным создание массива или проектировка

способ создания массива:
1. использование malloc - это си-стиль который не приветствуется в с++ и категорически неприемлим для выделения памяти под неплоские объекты (те у которых есть конструктор) - а именно это происходит во второй строчке кода
2.  c1 - указывает на массив объектов, а  не на массив указателей - что подтверждает пункт 1
3.  c1+i  - про это писалось выше
4.   p = new Class1(value);  - тут правильно все создается , только p указывает совершено не туда куда надо..
Самое интересное что это будет работать.. вот поэтому я и назвал ужос...

Добавлено через 2 минуты и 37 секунд
Цитата(yep @  9.8.2008,  00:15 Найти цитируемый пост)

Что именно на ваш взгляд я не осознаю в своём коде?


Цитата(yep @  9.8.2008,  00:15 Найти цитируемый пост)

Нет хотел выделить именно под 10 объектов типа class1. Указатель используется для заполнения этой выделенной памяти 

вот и ответ.. не понимаете как работает new, чем отличается от malloc, да и вобше какие бывают способы расположения обьектов в памяти 


--------------------
PM MAIL WWW   Вверх
yep
Дата 9.8.2008, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.9.2007

Репутация: нет
Всего: нет



Повторяю, я прекрасно осознаю, что написал. С чего вы решили, что если я и хотел выделить память по объекты класс1, то я чего-то не осознаю? Программа работает как надо.
Цитата(mes @  9.8.2008,  00:28 Найти цитируемый пост)
1. использование malloc - это си-стиль который не приветствуется в с++ и категорически неприемлим для выделения памяти под неплоские объекты (те у которых есть конструктор) - а именно это происходит во второй строчке кода

Поэтому я и спросил как эту строку записать при помощи new

Добавлено @ 00:41
Цитата(mes @  9.8.2008,  00:07 Найти цитируемый пост)
Class1 *p = c1+i; // циклично сдвигаем указатель по выделенной памяти с шагом равным размеру class1(a не размеру указателя)

а здесь что не так? я так и задумал заполнили кусок памяти равный класс1, сдвинулись на класс1 дальше, заполнили следующий кусок...

Добавлено @ 00:44
Цитата(mes @  9.8.2008,  00:28 Найти цитируемый пост)
не понимаете как работает new, чем отличается от malloc, да и вобше какие бывают способы расположения обьектов в памяти 

??? с чего вы взяли?

Добавлено @ 00:45
я использовал malloc только(!) потому что не знаю как это написать через new, как я уже неоднократно писал

Добавлено @ 00:48
c1 = (Class1 *)malloc(sizeof(Class1)*10);
если написать c1 = new Class1[10], даже если будет конструктор по умолчанию это будет, насколько я понимаю, лишняя трата времени на создание 10 объектов, которые всё равно придётся пересоздавать с нужным конструктором

Это сообщение отредактировал(а) yep - 9.8.2008, 00:49
PM MAIL   Вверх
mes
Дата 9.8.2008, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(yep @  9.8.2008,  00:36 Найти цитируемый пост)
я использовал malloc только(!) потому что не знаю как это написать через new, как я уже неоднократно писал 

вот удовлетворяю Ваше любопытство.. тот способ про который Вы спрашивали (но не советую использовать)
Код

class C2
{
    Class1 * p_c1;
    public:
     C2 (int i) { p_c1 = (Class1*) operator new (sizeof(Class1)*10);
             for (int j=0; j<10; ++j) new (&p_c1[j]) Class1(i); }

};



--------------------
PM MAIL WWW   Вверх
UnrealMan
Дата 9.8.2008, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(mes @  9.8.2008,  00:28 Найти цитируемый пост)
использование malloc - это си-стиль который не приветствуется в с++ и категорически неприемлим для выделения памяти под неплоские объекты (те у которых есть конструктор) 

Приемлим - так же, как и operator new.
PM MAIL   Вверх
mes
Дата 9.8.2008, 02:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(UnrealMan @  9.8.2008,  02:16 Найти цитируемый пост)
Приемлим - так же, как и operator new. 

вот и я о том же

Цитата(mes @  9.8.2008,  00:56 Найти цитируемый пост)
(но не советую использовать)


Добавлено через 51 секунду
в данном контексте нужен лишь для выделения памяти 


--------------------
PM MAIL WWW   Вверх
yep
Дата 9.8.2008, 02:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.9.2007

Репутация: нет
Всего: нет



А вот ещё что интересует. Среди полей есть ещё статические массивы. В установочных методах делаю проверку на выход за пределы. Если выход есть, делаю исключение. Вот и подумал использовать вектор вместо массива чтобы не делать проверку, или есть что-то более подходящее? Как обычно поступают?
PM MAIL   Вверх
mes
Дата 9.8.2008, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(yep @  9.8.2008,  02:26 Найти цитируемый пост)
Вот и подумал использовать вектор вместо массива чтобы не делать проверку, или есть что-то более подходящее? 

если неуверен, что попадаешь в  нужный диапазон в любом случае надо делать проверку, будь хоть обычный массив , хоть вектор.
Единственное что у вектора есть метод at, aналогичный [] , но возбуждает исключение при выходе за границы


--------------------
PM MAIL WWW   Вверх
yep
Дата 9.8.2008, 02:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 10.9.2007

Репутация: нет
Всего: нет



А [] разве не возбуждает? У меня в VS2008 возбуждает
PM MAIL   Вверх
mes
Дата 9.8.2008, 02:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(yep @  9.8.2008,  02:36 Найти цитируемый пост)
А [] разве не возбуждает? У меня в VS2008 возбуждает 

[] : http://msdn.microsoft.com/en-us/library/f26e12y5(VS.80).aspx
at : http://msdn.microsoft.com/en-us/library/c6kkh778(VS.80).aspx


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0946 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.