Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Инициализация константных полей |
Автор: yep 6.8.2008, 18:57 | ||
Есть класс с константным полем. Есть другой класс, который содержит статический массив из первого класса. Как инициализировать константные поля первого класса значением, переданным аргументом конструктора второго класса? Это выглядит типа
|
Автор: Alek86 6.8.2008, 19:39 |
вообще-то константность и убрать можно на крайняк но лучше динамический массив а еще лучше вектор |
Автор: mes 6.8.2008, 19:51 |
а вектор примет класс у которого нет конструктора без параметров ?? Добавлено через 1 минуту и 41 секунду крайняк это когда часть кода чужая.. ![]() А в данном случае помойму проблема с проектировкой ![]() |
Автор: Alek86 6.8.2008, 19:59 | ||
если есть конструктор копирования, то никуда он не денется
|
Автор: yep 6.8.2008, 20:00 |
В моём случае размер массива 10, и менять его никогда не придётся (в частности, поэтому и хочу его оставить статическим). Конечно, 10 элементов можно и вручную проинциализировать, но меня интересует как это делать по-нормальному. "так не пройдет , так как массив требует конструктора без параметров.." т.е. нельзя проиницилизировать по отдельности? Ничего необычного в этом не вижу и полагал, что это возможно, но попытавшись это сделать типа Class2::Class2(int i): c1[0]=i возникает ошибка error C2059: syntax error : '['. |
Автор: mes 6.8.2008, 20:13 |
нельзя , так это проскакивание через уровень.. подобная инициализация прошла бы на уровне массива .. но к сожалению у статического массива нельзя определить конструктор |
Автор: yep 8.8.2008, 17:56 | ||||
А как установить статический массив? полагаю, надо сначала выделить необходимую память для соответсвующего указателя, а потом присвоить циклом new Class1(value) написал так:
Но возникает ошибка времени выполнения. Если подход правильный, то в чём ошибка? И как написать c1 = (Class1 *)malloc(sizeof(Class1)*10); через new? |
Автор: mes 8.8.2008, 18:56 | ||||||
ужос.. (не говоря об опечатке в названии конструктора ![]()
|
Автор: andrew_121 8.8.2008, 18:59 | ||
По моему сдесь ошибка:
|
Автор: yep 8.8.2008, 23:52 | ||||||
Насчёт вектора тоже самое представил. Но подумал сделать так. Наверно сделаю вектором. А что значит ужос? Добавлено через 13 секунд такая запись, вероятно, создаст не десятиэлементыный массив, проинициализированный value, а создаст массив из value элементов, проинициализированных конструктором по умолчанию.
Сначала я выделил необходимую память, а потом начал её заполнять, при помощи указателя p. Понял в чём ошибка. Ошибся, что использовал new в строке p = new Class1(value); надо было *p = Class1(value); |
Автор: mes 9.8.2008, 00:07 | ||||
а самое плохое в том, что сами не осознаете что делаете.. вот в этом то и ужос ! Старайтесь писать проще.. не надо выдумывать ничего заоблачного и все само собой станет понятно .. ![]() |
Автор: yep 9.8.2008, 00:10 |
Я то прекрасно осознаю, просто ошибся в строке. После исправления ужос исчерпан? |
Автор: mes 9.8.2008, 00:12 |
если исправлением называется это : то нет |
Автор: yep 9.8.2008, 00:15 | ||||||||
Можно поконкретнее что здесь является заоблачным создание массива или проектировка? Проектировка мне нравится и считаю её удобной, надо было только преодолеть этот момент, который уже видимо преодолён. Добавлено через 3 минуты и 4 секунды
Что именно на ваш взгляд я не осознаю в своём коде? Добавлено через 4 минуты и 46 секунд Говорят new безопаснее malloc'a. Остался не отвеченным вопрос: как запись (Class1 *)malloc(sizeof(Class1)*10) через new? Добавлено через 12 минут и 34 секунды
Нет хотел выделить именно под 10 объектов типа class1. Указатель используется для заполнения этой выделенной памяти |
Автор: mes 9.8.2008, 00:28 | ||
способ создания массива: 1. использование malloc - это си-стиль который не приветствуется в с++ и категорически неприемлим для выделения памяти под неплоские объекты (те у которых есть конструктор) - а именно это происходит во второй строчке кода 2. c1 - указывает на массив объектов, а не на массив указателей - что подтверждает пункт 1 3. c1+i - про это писалось выше 4. p = new Class1(value); - тут правильно все создается , только p указывает совершено не туда куда надо.. Самое интересное что это будет работать.. вот поэтому я и назвал ужос... Добавлено через 2 минуты и 37 секунд
вот и ответ.. не понимаете как работает new, чем отличается от malloc, да и вобше какие бывают способы расположения обьектов в памяти |
Автор: yep 9.8.2008, 00:36 | ||||||
Повторяю, я прекрасно осознаю, что написал. С чего вы решили, что если я и хотел выделить память по объекты класс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 объектов, которые всё равно придётся пересоздавать с нужным конструктором |
Автор: mes 9.8.2008, 00:56 | ||||
вот удовлетворяю Ваше любопытство.. тот способ про который Вы спрашивали (но не советую использовать)
|
Автор: UnrealMan 9.8.2008, 02:16 | ||
Приемлим - так же, как и operator new. |
Автор: mes 9.8.2008, 02:23 |
вот и я о том же Добавлено через 51 секунду в данном контексте нужен лишь для выделения памяти |
Автор: yep 9.8.2008, 02:26 |
А вот ещё что интересует. Среди полей есть ещё статические массивы. В установочных методах делаю проверку на выход за пределы. Если выход есть, делаю исключение. Вот и подумал использовать вектор вместо массива чтобы не делать проверку, или есть что-то более подходящее? Как обычно поступают? |
Автор: mes 9.8.2008, 02:33 | ||
если неуверен, что попадаешь в нужный диапазон в любом случае надо делать проверку, будь хоть обычный массив , хоть вектор. Единственное что у вектора есть метод at, aналогичный [] , но возбуждает исключение при выходе за границы |
Автор: yep 9.8.2008, 02:36 |
А [] разве не возбуждает? У меня в VS2008 возбуждает |
Автор: mes 9.8.2008, 02:41 |
[] : http://msdn.microsoft.com/en-us/library/f26e12y5(VS.80).aspx at : http://msdn.microsoft.com/en-us/library/c6kkh778(VS.80).aspx |