![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Pro100MoNEy |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.11.2010 Репутация: нет Всего: нет |
Написал небольшой парсер для BSDL файлов, но получилось как-то функционально что ли, я не смог выделить абстракции, к тому же приходится создавать объект парсера, затем вызвать функцию и передавать ему имя файла и объект для того что он разобрал(jtagDevice), мне кажется можно проще или более гибко но не могу придумать как, плюс зачемто унаследовал его от QObject что было лишним это я уберу, с помощью него разбираю отдельно файлы или папки вызывая для каждого файла parse(), еще вопрос как обрабатывать ситуации когда он не нашел чегото, можно ли использовать исключения или они не подходят и это будет избыточным, пока что просто вывожу в консоль если чтото не так, еще не встречал файла с ошибкой.
Вот класс:
И еще вопрос Допустим есть два класса
Мне нужно хранить много экземпляров этих класов, я создал класс хранилище который хранит указатели на базовый класс в векторе, дает доступ к желементам и еще какойто функционал. Я передаю в вектор указатели на объект так push(new Obj1()) push(new Obj2()). Соответственно обратно тоже указатель на базовый класс. Удаляю обьекты в деструкторе хранилища
Если комуто не лень скажите пожалуйста 1)Это хорошее решение хранить указатели а не объекты, и удалять их в деструкторе вышеописанным образом 2)Можно ли так использовать наследование как в Obj1 Obj2 или стоит определить виртуальный класс и два наследника(или вобще хранить все в одном и определять тип как пустая строка Str_Child или нет, что в принципе я и собираюсь делать с классами Obj1 Obj2 тк нужно определять тип) 3) Как выбрать хранить указатель на данные (str_Base,str_child) или переменные. Спасибо всем ответившим и прочитавшим до конца. |
||||||||||
|
|||||||||||
SenkraD |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: нет Всего: 23 |
если класс Obj2 розширяет класс Obj1, то да. а вот если нужна просто имплементация класса Obj1 в классе Obj2, то тут дело вкуса. определить интерфейс, чтобы через него работать можно и зачастую это правильное решение а по самому парсеру: можно просто розбить код на более мелкие функции и этого будет достаточно, чтобы код читался легче и легче модифицировался, а вот если вы вкладуете в понятие ООП что-то типа "нужно больше класов", то смотрите в сторону паттерна State и/или в сторону конечных автоматов, но не думаю, что вам тут нужет такой классовый оверхед, хотя если вы в целях самообразования, то пожалуйста Это сообщение отредактировал(а) SenkraD - 6.7.2013, 18:55 |
||||
|
|||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Парсером это можно назвать с натяжкой. Почитайте, как делают парсеры (хотя бы у Ахо и Ульман в их Dragon book'е). Или возьмите готовый генератор парсеров (начиная от классического yacc/bison и кончая spirit'ом из boost'а) |
|||
|
||||
Pro100MoNEy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.11.2010 Репутация: нет Всего: нет |
Под хранить указатель или переменную имел ввиду например в классе Obj1 есть строка и число, как лучше задать их указателями и выделять память например в конструкторе, или просто создать в классе переменные,
или
наверрно это дело вкуса, но есть же плюсы и минусы? Это сообщение отредактировал(а) Pro100MoNEy - 6.7.2013, 23:38 |
||||
|
|||||
SenkraD |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 933 Регистрация: 3.2.2006 Где: Украина::Киев Репутация: нет Всего: 23 |
создаются через указатели когда
минусы указателей:
P.S. оба списка можно розширять долго, но это так сказать основное |
|||
|
||||
vvms |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 7.10.2008 Репутация: нет Всего: 1 |
Немного не по теме вопроса, но по предъявленному коду:
1. Не очень понятно зачем проверять наличие файла после попытки его открытия. Поскольку используется Qt, то тут два варианта: а) убрать строку "if(!File->exists()){" совсем, так как метод open у QFile возвращает true/false - смог открыть или нет, вот результат open проверять и надо б) если хочется все-таки проверить наличие, то делать это до реального открытия файла, плюс ко всему у QFile есть статический метод exists, что не требует создания объекта. Для случая б) получим такой код:
2. Утечки памяти тоже надо чинить. "File=new QFile(filename)" - имеется, а вот "delete File" - отсутствует вообще, а должен быть перед каждым "return false" или "return true". Конкретно, в приложенном коде как минмум 2 возможных места утечки: 11 строка и 25. Если воспользоваться моим предожением б) из первого пункта, утечка возможна только в 25 строке. Добавочно, в 25 строке еще будет утечка из-за неудаленного объекта, созданного в строке 16. |
|||
|
||||
Pro100MoNEy |
|
||||
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.11.2010 Репутация: нет Всего: нет |
Спасибо! Действительно File я забыл удалить. |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |