![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| nns2009 |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
У меня почему-то не создаётся массив классов, точнее создаётся, но не эксплуатируется. Я пытаюсь создать так:
сама строчка создания прекрасно работает ( pastime pases[2]; ), но потом строчки вида: pases[0].r = 120; не работают, компилятор пишет что: 1) нельзя объявить массив размером 0 2) массив не может быть типа default-int 3) нельзя объявить два массива с одинаковым именем хотя во второй строчке я лишь назначаю свойство r первого элемента массива равным 120. |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
во первых массив объектов, а не классов
а во вторых как я понял, те строчки, в которых ошибки, Вы решили не показывать ? Добавлено через 1 минуту и 57 секунд приведите один полноценный фрагмент (не весь код, а логически полный участок кода), и ошибки которые в нем встретились иначе получается гадание на кофейной гуще. |
|||
|
||||
| nns2009 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
Код класса приведён полностью.
В первых двух кодах не работают строчки 1 и 2, хотя по моему они абсолютно правильные. Ещё если я наберу код pastime pases[2]; pases[0].r = 120; То компилятор выдаёт написанные мною выше ошибки. На мой взгляд код правильный, но компилятор так не считает. По мнению компилятора у меня в 1 и 2 строчке кода в первом и втором коде ошибки. Это сообщение отредактировал(а) nns2009 - 1.2.2009, 19:59 |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
из конструкторов/деструкторов не делают return, тк у них нет возвращаемого значения.
что касается ошибок, то возможная причина - компилятор еще не знает, что такое pastime. Например, когда этот класс еще не полностью объявлен до этих строк |
|||
|
||||
| nns2009 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
убрал return; , но ошибок ничуть не сократилось. Код объявления массива расположен после объявления всего класса. |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
точку с запятой нигде не пропустил?
Добавлено через 6 минут и 11 секунд и потом, byte и BYTE это несколько разные типы, так что твой код компилироваться не будет Добавлено через 7 минут и 4 секунды И keywords типа public protected & private тоже не зря придумали. Но это так, на будущее.. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
судя по ошибкам, компилятор считает что Вы не объявили класс или пытаесь его использовать до первого объявления. Но по участкам кода, которые Вы привели невозможно судить о порядке определений. поэтому и просил выложить фрагмент кода из которого убрано все лишнее.. т.е должно было получиться примерно следующее :
если у Вас в таком виде не работает, то остается предположение, что не определен тип BYTE; P.S. На будущее : Вы привели кучу кода не относящегося к проблеме, не проделали никаких попыток, чтоб выявить источник проблемы и более того скрыли те места, которые Важны для понимания Вашей проблемы.. И так как на форуме нет телепатов, ответ на вопрос такой категории очень затруднителен. и кстати форматирование кода никто не запрещал Это сообщение отредактировал(а) mes - 1.2.2009, 20:31 |
|||
|
||||
| nns2009 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
Посмотрел на код (приведённый в сообщении выше) и заметил единственное отличие от моего:
Массив объявлён и работа производится с ним в теле функции main(), (а у меня и объявление и работа с массивом производилась вне всякой функции.) Теперь всё работает, правда массив я всё таки объявил в глобальном виде: массив будет использоваться и в WinMain(инициализация), и в обработчике сообщений, а как передавать объекты из WinMain в обработчик сообщений я не знаю. Глобальные объекты очень удобы! |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
Низачет. Глобальные объекты, тем более неконстантные, сакс. Это сообщение отредактировал(а) pan2004 - 1.2.2009, 21:25 |
|||
|
||||
| EnergoHokum |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 600 Регистрация: 10.11.2006 Где: Россия, Ставропол ь Репутация: нет Всего: 6 |
Хоть конструкторы и деструкторы и не возвращают значения, однако для симметрии можно поставить "пустой" return. Это допустимо.
По теме вопроса, что сразу бросилось в глаза: 1) ты создаёшь экземпляры классов динамически (через new), а обращаешься к ним, как к статически созданным (pases[0].r=120;, надо бы pases[0]->r=120;). 2) как я понял, тебе нужен одномерный массив элементов класса, тогда создавать (и удалять) его нужно так:
Как-то так... |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Массив можно объявить глобальной переменной - тогда конструктор по умолчанию будет вызван до main(), а деструктор после main. Вне функции нельзя делать никакие манипуляции с классом:
А то что просили привести ошибки компилятора, то это именно то что выдаёт компилятор на английском, а не Ваш перевод, который мог быть неправильным |
|||
|
||||
| nns2009 |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 1.2.2009 Репутация: нет Всего: 1 |
Как я уже написал у меня всё заработало, но если интересны ошибки компилятора, то на такой код(написанный вне функций):
компилятор выдаёт такие ошибки: c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(78) : error C2466: cannot allocate an array of constant size 0 c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(78) : error C2143: syntax error : missing ';' before '.' c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(78) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(78) : error C2371: 'pases' : redefinition; different basic types c:\microsoft visual studio 9.0\all\c++\timetable\timetable\timetable.cpp(77) : see declaration of 'pases' сейчас я всё исправил: вне функций идёт объявление массива: pastime pases[2]; а в функции WinMain() - заполнение: pases[0] = new pastime(255, 0, 0, "Отдых", "В это время работник может отдыхать."); pases[1] = new pastime(0, 255, 0, "Работа", "В это время работник обязан работать."); Если кому интересно почему эти 2 строки работают(объекту типа pastime присваивается указатель возвращаемый операцией new), то скажу: в классе я перегрузил равенство и теперь могу использовать конструктор сколько мне захочется.
|
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
интерес к ошибкам был проявлен не из за любопытства, как Вы могли подумать, а для того чтоб лучше съорентироваться в решении Вашей же проблемы и советы по тому как лучше оформлять вопрос давались на будущее, на случай если у Вас опять возникнет проблема и Вы захотите прибегнуть к помощи форумчан. Ну а в остальном рад за Вас, что у Вас все получилось и удачи Добавлено через 1 минуту и 1 секунду P.S. и не забудьте пометить тему как решенную... |
|||
|
||||
| pan2004 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 357 Регистрация: 28.7.2007 Репутация: 1 Всего: 9 |
nns2009, эти две строчки конечно работают, только память-то все равно утекает... На каждый new должен быть delete.
Нехорошо так делать. Добавлено через 5 минут и 24 секунды Мне так кажется, ты перешел с другого языка(C#, Basic whatever) на C++ и пытаешься использовать старые приемчики. Вот, например, оператор равенства переделал. Или откуда-то взял, что код вне функций будет исполняться. Но увы, это не C-way. Избавляйся от старых привычек. Те же глобальные переменные у сишников(и особенно у пользователей C++) не находятся в большом почете. |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Если переход с C# то нужно извавляться от НОВЫХ привычек (где сборщик мусора всё удалит). но C# не позволяет объявлять глобальные переменные.
Так же гловальные переменные не хороши тем что что-то(конструкторы) выполняется до main(), а что-то (деструкторы) после main(). Если ошибка в них, можно долго не понять где ошибка - ставишь breakpoint в начале и на выходе main(), внутри main() ошибок нет ... |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |