| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Массивы в классах |
| Автор: Nuzur 28.3.2005, 19:05 |
| Как лучше реализовать такую штуку? Пробывал define так потом нельзя доступиться к переменным. Короче мне нужно огбьявить размер масива и сам масив, конечно, чтобы я потом смог получиь данный размер, в плане как переменная класа. |
| Автор: chipset 28.3.2005, 20:24 | ||
Оно? Хотя жестко размер ты не сможешь задать при создании.. |
| Автор: Nuzur 28.3.2005, 20:50 | ||||
Нет не то. У меня свой клас. И там нужно разместить массив, например целых чисел. Как это сделать чтобы размер масива была членом класса. Тобиш примерно так Const int size; int array[size] Сорри если как-то не так выразился. |
| Автор: chipset 28.3.2005, 20:54 | ||
Так? Ну можно ещё size запихнуть в класс. |
| Автор: Nuzur 28.3.2005, 21:01 | ||||
const int size = 10; int array[size]; c:\program files\microsoft visual studio\myprojects\skb_rhytm\karavayevidachi\xsender\control.h(42) : error C2258: illegal pure syntax, must be '= 0' c:\program files\microsoft visual studio\myprojects\skb_rhytm\karavayevidachi\xsender\control.h(42) : error C2252: 'size' : pure specifier can only be specified for functions c:\program files\microsoft visual studio\myprojects\skb_rhytm\karavayevidachi\xsender\control.h(43) : error C2065: 'size' : undeclared identifier c:\program files\microsoft visual studio\myprojects\skb_rhytm\karavayevidachi\xsender\control.h(43) : error C2057: expected constant expression c:\program files\microsoft visual studio\myprojects\skb_rhytm\karavayevidachi\xsender\control.h(43) : warning C4200: nonstandard extension used : zero-sized array in struct/union c:\program files\microsoft visual studio\myprojects\skb_rhytm\karavayevidachi\xsender\control.h(53) : error C2229: class 'IoControl' has an illegal zero-sized array Так что-ли? |
| Автор: chipset 28.3.2005, 21:04 | ||
| Ты что-то неправильно делаешь, покажи тот код который ты компилировал. Вот:
Компилицца и не жужжит, компилер VC7.1. |
| Автор: Nuzur 28.3.2005, 21:12 | ||||
Ну ты что издеваешся? Если константа за пределами класа компилиться нормально, и я про ЭТО знаю. Ты, простите вы, внесите константу в класс....и полезут ероры. у меня VC++ 6.0 П.С. Я попробовал с внешней константой и все сработало. Но меня так не устраивает поскольку мне нужно знать размер масссссива с которым мне потом прийдеться рАботать. Предупреждаю лишнее прения и последующие непонятки. |
| Автор: chipset 28.3.2005, 21:48 | ||
Продолжаем извращения и делаем так: ;P
|
| Автор: Nuzur 28.3.2005, 21:57 |
| Те же, входит Гамлет: : error C2258: illegal pure syntax, must be '= 0' : error C2252: 'size' : pure specifier can only be specified for functions : error C2065: 'size' : undeclared identifier : error C2057: expected constant expression : warning C4200: nonstandard extension used : zero-sized array in struct/union : error C2229: class 'IoControl' has an illegal zero-sized array Короче так тоже не фурычит! А по компилятору ты не прав жужжжит и матом кроет |
| Автор: chipset 28.3.2005, 21:59 | ||
А причем тут IoControl? Какой у тебя компилер? |
| Автор: Nuzur 28.3.2005, 22:07 | ||||
IoControl имя моего класа. И не уходите от темы..... Хотите мне мозги запудрить чтобы я про сабж забыл Суть там не в названии класса, он копилиться и РАБОТАЕТ отлично, но с масивом он бы стал лучше Он даже компилиьтся с внешней константой. Но когда я делаю, деже static const int size = 10; он уже ругаеться : error C2258: illegal pure syntax, must be '= 0' : error C2252: 'size' : pure specifier can only be specified for functions |
| Автор: chipset 28.3.2005, 22:11 | ||
Ещё раз повторю:
Компилится как на VC7.1, так и на gcc. Можете проверить.. Что у вас там написано, я знать не могу... |
| Автор: Nuzur 28.3.2005, 22:29 | ||||
Раз |
| Автор: Nuzur 28.3.2005, 22:30 | ||||
Два |
| Автор: chipset 28.3.2005, 22:39 |
| Что ещё раз потверждает что VC6 mustdie. Он плохо поддерживает стандарт.. Почему не хочешь использовать вектор? |
| Автор: Nuzur 28.3.2005, 22:46 |
| Кто может ответить ИМЕННО для VC++ 6.0 ? chipset спасибо за попытку помочь. |
| Автор: chipset 28.3.2005, 22:50 | ||
vector использовать религия запрещает? уж он то в VC6 должен быть.. |
| Автор: Fire-Plug 28.3.2005, 23:47 | ||
100%-но надежный вариант обьявления констант в классах:
|
| Автор: chipset 28.3.2005, 23:53 |
| Fire-Plug, извращение |
| Автор: Fire-Plug 29.3.2005, 00:17 | ||
chipset Я где-то уже говорил, что STL c 1998 г. включена в стандарт С++ и является неотьемлемой частью языка. За последние 4 года у меня нет ни одной проги, где бы не использовалась STL. Но народ упорствует... vector им, видишь ли, не годится А enum в обьявлении класса - очень практичная штука, и не только для размера массива, а для кодов ошибок, списка состояний, списка операций... продолжать можно бесконечно. |
| Автор: Goryachev 29.3.2005, 00:24 | ||||
Действительно, опять мелкософт маразмом занимались.
На VC7.0 компилируется, а на VC6 нет. Поэтому единственный выход для VC6:
А вообще-то с enum все очень круто работает. |
| Автор: Fire-Plug 29.3.2005, 05:02 | ||||
Пример полезного совместного использования enum и массивов - машина состояний
Goryachev, благодарю, но лучше ты бы мне репутацию поднял |
| Автор: Nuzur 29.3.2005, 07:56 |
| Меня не интересует тема с енумами. Вектором я умею пользоваться. НО меня ИНТЕРЕСОВАЛ именно ответ на этот вопрос. Если КТО-ТО знает ответ на ЭТОТ вопрос, милости прошу, все остальных прошу не загрязнять тему вашими разговорами на филосовские темы. Заранее спасибо. |
| Автор: chipset 29.3.2005, 08:04 | ||||
Тогда конкретизируйтесь. Изворот с енумами подходит?
Пока что я видел только разговор по теме. |
| Автор: jorkug 29.3.2005, 14:08 | ||||
Чем тебя этот вариант не устраивает? |
| Автор: Fire-Plug 29.3.2005, 18:12 | ||||||
Да решение элементарное.
Просто вместе c массивом следует добавить в класс его размер и инициализировать той же константой.
Если ты лабу делаешь в КПИ на Караваевых дачах, то требования понятны, а если это реальный проект, то любое работающее решение должно быть приемлемо, тем более с использованием STL. |
| Автор: _hunter 29.3.2005, 18:32 |
| а зачем описывать статический массив. не проще ли описать динамический и создать его в конструкторе? |
| Автор: chipset 29.3.2005, 19:09 |
| _hunter, я это спрашиваю всю тему уже... |
| Автор: _hunter 29.3.2005, 19:15 | ||
| не... я так:
имею в виду |
| Автор: chipset 29.3.2005, 19:16 | ||
У Nuzur'a такая фишка вызывает еррору. |
| Автор: Nuzur 29.3.2005, 19:23 |
| Всем спасибо. Это реальный порект, а не лаба, я б так не парился. Я решил эту проблему, но к сожелению он не может быть прИмЕнен в других проектах, покрайней мере как догма. Решил эту порблему через sizeof. И вообще я так понял надо на 7-й студио переходить. Короче всем спасибо, сорри коль чем кого обидел. |
| Автор: _hunter 29.3.2005, 19:28 | ||||||
он привел рисунок с ошибкой только на:
а на
ничего не сказал... но если так не катит, можно так:
|
| Автор: Олег М 29.3.2005, 19:31 | ||||
А имя переменной не пробовал поменять? а то size как-то мутновато, например
|
| Автор: Nuzur 29.3.2005, 20:14 |
| Пробывал. Только это ничего не дало. Просто 6-й с-шник(хоть я его и люблю) видать кривой малеха. У каждого всои недостатки, тут ничего не попишеш. |
| Автор: _hunter 29.3.2005, 22:20 |
| Nuzur, а мой вариант чем не подходит? |
| Автор: BreakPointMAN 29.3.2005, 22:36 | ||
| Ребята, ну что вы паритесь? C++ позволяет объявлять константы как члены класса, но инициализируются они с помощью конструктора - один единственный раз - и не могут изменяться в дальнейшем... Если какой-нибудь компилятор это и проглатывает, это, тем не менее, отступление от стандарта. Но, впрочем, можно пойти на такую хитрость:
...и это в случае, если массив должен быть фиксированной размерности... ну а если размерность меняется, не остается ничего иного, кроме как выделять память динамически, работать с указателями и не забывать подчищать за собой... %)) ... ммм... а вообще, если членом класса надо сделать массив, то я бы рекомендовал использовать возможности STL, к примеру... |
| Автор: _hunter 29.3.2005, 22:56 |
| BreakPointMAN, найди существенные отличия между своим вариантом и вариантом Fire-Plug' a.... |
| Автор: Goryachev 30.3.2005, 09:45 |
| _hunter Найди отличия между твоим вариантом, и моим на 2 странице. |
| Автор: _hunter 30.3.2005, 13:48 |
| опа... согласен. |
| Автор: Hroft 31.3.2005, 11:42 | ||||
Клево. А вообще, решение с enum очень прикольное, лично я о них всегда забываю
Тогда уж еще проще в аргумент конструктора размер впихнуть... и получить обрезанный vector Короче говоря, непонятно, что не нравится уважаемому автору топика... Любое решение, даже с дефайном, подходит. При чем тут sizeof, мне вообще непонятно |
| Автор: np9mi7 31.3.2005, 12:30 |
| использую STL и vector<> в качестве свойства объекта и все проблемы решены... и с ресурсами коректно и динамически все можно |
| Автор: Fire-Plug 1.4.2005, 00:25 | ||||
Who cares (т.е. кого греет)!!! #define - это архаизм и доводы в пользу данной характеристики давно стали обшшым местом. Лично я использую #define крайне редко в случаях, когда не хватает воображения чтобы соорудить inline-ф-цию, напр.:
|
| Автор: Hroft 1.4.2005, 10:15 | ||
Я, вообще-то, не против дефайна написал, а против знака "=" после оного. |