| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Дайте совет |
| Автор: Pro100MoNEy 6.7.2013, 15:34 | ||||||||||
| Написал небольшой парсер для BSDL файлов, но получилось как-то функционально что ли, я не смог выделить абстракции, к тому же приходится создавать объект парсера, затем вызвать функцию и передавать ему имя файла и объект для того что он разобрал(jtagDevice), мне кажется можно проще или более гибко но не могу придумать как, плюс зачемто унаследовал его от QObject что было лишним это я уберу, с помощью него разбираю отдельно файлы или папки вызывая для каждого файла parse(), еще вопрос как обрабатывать ситуации когда он не нашел чегото, можно ли использовать исключения или они не подходят и это будет избыточным, пока что просто вывожу в консоль если чтото не так, еще не встречал файла с ошибкой. Вот класс:
И еще вопрос Допустим есть два класса
Мне нужно хранить много экземпляров этих класов, я создал класс хранилище который хранит указатели на базовый класс в векторе, дает доступ к желементам и еще какойто функционал. Я передаю в вектор указатели на объект так push(new Obj1()) push(new Obj2()). Соответственно обратно тоже указатель на базовый класс. Удаляю обьекты в деструкторе хранилища
Если комуто не лень скажите пожалуйста 1)Это хорошее решение хранить указатели а не объекты, и удалять их в деструкторе вышеописанным образом 2)Можно ли так использовать наследование как в Obj1 Obj2 или стоит определить виртуальный класс и два наследника(или вобще хранить все в одном и определять тип как пустая строка Str_Child или нет, что в принципе я и собираюсь делать с классами Obj1 Obj2 тк нужно определять тип) 3) Как выбрать хранить указатель на данные (str_Base,str_child) или переменные. Спасибо всем ответившим и прочитавшим до конца. |
| Автор: xvr 6.7.2013, 22:03 |
Парсером это можно назвать с натяжкой. Почитайте, как делают парсеры (хотя бы у Ахо и Ульман в их Dragon book'е). Или возьмите готовый генератор парсеров (начиная от классического yacc/bison и кончая spirit'ом из boost'а) |
| Автор: Pro100MoNEy 6.7.2013, 23:37 | ||||||||||||
Под хранить указатель или переменную имел ввиду например в классе Obj1 есть строка и число, как лучше задать их указателями и выделять память например в конструкторе, или просто создать в классе переменные,
или
наверрно это дело вкуса, но есть же плюсы и минусы? |
| Автор: SenkraD 7.7.2013, 00:32 |
создаются через указатели когда
минусы указателей:
P.S. оба списка можно розширять долго, но это так сказать основное |
| Автор: vvms 8.7.2013, 04:45 | ||
| Немного не по теме вопроса, но по предъявленному коду: 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 8.7.2013, 20:48 | ||||
Спасибо! Действительно File я забыл удалить. |