![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
yep |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
Есть класс с константным полем. Есть другой класс, который содержит статический массив из первого класса. Как инициализировать константные поля первого класса значением, переданным аргументом конструктора второго класса?
Это выглядит типа
Это сообщение отредактировал(а) yep - 6.8.2008, 19:35 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так не пройдет , так как массив требует конструктора без параметров.. как обходной вариант : создать динамический массив П.С. непойму.. Вы вручную собирались задавать значения всем 20 объектам, а если бы их было 2000 ? |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
вообще-то константность и убрать можно на крайняк
но лучше динамический массив а еще лучше вектор |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а вектор примет класс у которого нет конструктора без параметров ?? Добавлено через 1 минуту и 41 секунду крайняк это когда часть кода чужая.. ![]() А в данном случае помойму проблема с проектировкой ![]() |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
если есть конструктор копирования, то никуда он не денется
|
|||
|
||||
yep |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
В моём случае размер массива 10, и менять его никогда не придётся (в частности, поэтому и хочу его оставить статическим). Конечно, 10 элементов можно и вручную проинциализировать, но меня интересует как это делать по-нормальному.
"так не пройдет , так как массив требует конструктора без параметров.." т.е. нельзя проиницилизировать по отдельности? Ничего необычного в этом не вижу и полагал, что это возможно, но попытавшись это сделать типа Class2::Class2(int i): c1[0]=i возникает ошибка error C2059: syntax error : '['. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
нельзя , так это проскакивание через уровень.. подобная инициализация прошла бы на уровне массива .. но к сожалению у статического массива нельзя определить конструктор |
|||
|
||||
yep |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
А как установить статический массив?
полагаю, надо сначала выделить необходимую память для соответсвующего указателя, а потом присвоить циклом new Class1(value) написал так:
Но возникает ошибка времени выполнения. Если подход правильный, то в чём ошибка? И как написать c1 = (Class1 *)malloc(sizeof(Class1)*10); через new? Это сообщение отредактировал(а) yep - 8.8.2008, 18:04 |
||||
|
|||||
mes |
|
||||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ужос.. (не говоря об опечатке в названии конструктора ![]()
Это сообщение отредактировал(а) mes - 8.8.2008, 18:58 |
||||||
|
|||||||
andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
По моему сдесь ошибка:
-------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
yep |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
Насчёт вектора тоже самое представил. Но подумал сделать так. Наверно сделаю вектором. А что значит ужос? Добавлено через 13 секунд такая запись, вероятно, создаст не десятиэлементыный массив, проинициализированный value, а создаст массив из value элементов, проинициализированных конструктором по умолчанию.
Сначала я выделил необходимую память, а потом начал её заполнять, при помощи указателя p. Понял в чём ошибка. Ошибся, что использовал new в строке p = new Class1(value); надо было *p = Class1(value); |
||||||
|
|||||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а самое плохое в том, что сами не осознаете что делаете.. вот в этом то и ужос ! Старайтесь писать проще.. не надо выдумывать ничего заоблачного и все само собой станет понятно .. ![]() Это сообщение отредактировал(а) mes - 9.8.2008, 00:10 |
||||
|
|||||
yep |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
Я то прекрасно осознаю, просто ошибся в строке. После исправления ужос исчерпан?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если исправлением называется это : то нет |
|||
|
||||
yep |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
Можно поконкретнее что здесь является заоблачным создание массива или проектировка? Проектировка мне нравится и считаю её удобной, надо было только преодолеть этот момент, который уже видимо преодолён. Добавлено через 3 минуты и 4 секунды
Что именно на ваш взгляд я не осознаю в своём коде? Добавлено через 4 минуты и 46 секунд Говорят new безопаснее malloc'a. Остался не отвеченным вопрос: как запись (Class1 *)malloc(sizeof(Class1)*10) через new? Добавлено через 12 минут и 34 секунды
Нет хотел выделить именно под 10 объектов типа class1. Указатель используется для заполнения этой выделенной памяти |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
способ создания массива: 1. использование malloc - это си-стиль который не приветствуется в с++ и категорически неприемлим для выделения памяти под неплоские объекты (те у которых есть конструктор) - а именно это происходит во второй строчке кода 2. c1 - указывает на массив объектов, а не на массив указателей - что подтверждает пункт 1 3. c1+i - про это писалось выше 4. p = new Class1(value); - тут правильно все создается , только p указывает совершено не туда куда надо.. Самое интересное что это будет работать.. вот поэтому я и назвал ужос... Добавлено через 2 минуты и 37 секунд
вот и ответ.. не понимаете как работает new, чем отличается от malloc, да и вобше какие бывают способы расположения обьектов в памяти |
|||
|
||||
yep |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
Повторяю, я прекрасно осознаю, что написал. С чего вы решили, что если я и хотел выделить память по объекты класс1, то я чего-то не осознаю? Программа работает как надо.
Поэтому я и спросил как эту строку записать при помощи new Добавлено @ 00:41
а здесь что не так? я так и задумал заполнили кусок памяти равный класс1, сдвинулись на класс1 дальше, заполнили следующий кусок... Добавлено @ 00:44
??? с чего вы взяли? Добавлено @ 00:45 я использовал malloc только(!) потому что не знаю как это написать через new, как я уже неоднократно писал Добавлено @ 00:48 c1 = (Class1 *)malloc(sizeof(Class1)*10); если написать c1 = new Class1[10], даже если будет конструктор по умолчанию это будет, насколько я понимаю, лишняя трата времени на создание 10 объектов, которые всё равно придётся пересоздавать с нужным конструктором Это сообщение отредактировал(а) yep - 9.8.2008, 00:49 |
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот удовлетворяю Ваше любопытство.. тот способ про который Вы спрашивали (но не советую использовать)
|
||||
|
|||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот и я о том же Добавлено через 51 секунду в данном контексте нужен лишь для выделения памяти |
|||
|
||||
yep |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
А вот ещё что интересует. Среди полей есть ещё статические массивы. В установочных методах делаю проверку на выход за пределы. Если выход есть, делаю исключение. Вот и подумал использовать вектор вместо массива чтобы не делать проверку, или есть что-то более подходящее? Как обычно поступают?
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
если неуверен, что попадаешь в нужный диапазон в любом случае надо делать проверку, будь хоть обычный массив , хоть вектор. Единственное что у вектора есть метод at, aналогичный [] , но возбуждает исключение при выходе за границы |
|||
|
||||
yep |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 10.9.2007 Репутация: нет Всего: нет |
А [] разве не возбуждает? У меня в VS2008 возбуждает
|
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |