|
ourlifeforus
|
|
Хотел бы попросить помочь разобраться в куске кода02.06.2009, 19:33. Показов 857. Ответов 1
Метки нет (Все метки)
Всю программу приводить смысла нету, программа представляет собой интерпретатор формул на с++.
Есть файл, в котором определены лексемы, функции и операторы namespace ForInt { // **************************************** ************************************* // определение лексем typedef enum { ID, // идентификатор S_OP, // операция суммирования M_OP, // операция умножения E_OP, // операция возведения в степень F_OP, // вызов функции R_PAR, // правая скобка L_PAR, // левая скобка Num_OP // число } LexemType; // весовые коэффициенты операций const int PRIO_SUMM = 2; const int PRIO_MULT = 3; const int PRIO_FUNC = 7; const int PRIO_UMINUS = 6; const int PRIO_IDENT = 0; const int PRIO_PAR = 1; const int PRIO_EXP = 5; class FuncOP : public Lexem { friend class Identifier; public: FuncOP() : Lexem() {}; FuncOP(const char *name_) : Lexem(name_) {}; LexemType getType() const { return F_OP; }; virtual int getPrio() const { return PRIO_FUNC; }; }; // вычисление синуса class SinOP : public FuncOP { public: SinOP() : FuncOP("sin") {}; double eval(double x) const { return sin(x); }; }; // вычисление cos class CosOP : public FuncOP { public: CosOP() : FuncOP("cos") {}; double eval(double x) const { return cos(x); }; }; // вычисление tg class TgOP : public FuncOP { public: TgOP() : FuncOP("tg") {}; double eval(double x) const { return tan(x); }; }; Сложность вызывает следующее... в этом же файле есть такие классы typedef Factory::Hire<std::string, FuncOP> FuncHire; class Math : public FuncHire { private: Math() { registerProduct("abs", new AbsOP()); registerProduct("exp", new EExpOP()); registerProduct("sin", new SinOP()); registerProduct("cos", new CosOP()); registerProduct("tg", new TgOP()); registerProduct("tan", new TgOP()); registerProduct("ctg", new CtgOP()); registerProduct("sqrt", new SqrtOP()); registerProduct("lg", new LgOP()); registerProduct("ln", new LnOP()); registerProduct("arcsin", new ArcsinOP()); registerProduct("arccos", new ArccosOP()); registerProduct("arctg", new ArctgOP()); registerProduct("atan", new ArctgOP()); registerProduct("Round", new RoundOP()); registerProduct("Floor", new FloorOP()); registerProduct("/-/", new UnaryMinusOP()); }; ~Math() {}; friend class Singleton::Singleton<Math>; }; typedef Singleton::Singleton<Math> MathSpace; template <> MathSpace* MathSpace: Instance = NULL;аналогично тут же еще один отдельный класс typedef Factory::Hire<std::string, Lexem> LexemHire; class SignFactory : public LexemHire { private: SignFactory() : LexemHire () { registerProduct("+", new PlusOP()); registerProduct("-", new MinusOP()); registerProduct("*", new ProdOP()); registerProduct("/", new DivOP()); registerProduct("^", new ExpOP()); registerProduct("(", new LeftPar()); registerProduct(")", new RightPar()); }; ~SignFactory() {}; friend class Singleton::Singleton<SignFactory>; }; typedef Singleton::Singleton<SignFactory> BinarySigns; template <> BinarySigns* BinarySigns: Instance = 0;Lexem* ProdOP::_toadd() { if (nsign == 2) { SignFactory& signfactory = BinarySigns::getInstance(); Lexem* item = signfactory.pcreate("^"); return item; } else return this; }; Фабрика и синглетон приведены в двух отдельных файлах, Помогите пожалуйста разобраться как это все работает... #ifndef FACTORY_HPP_ #define FACTORY_HPP_ # include <list> # include <map> # include <cstdlib> namespace Factory { // **************************************** ********************************* // фабрика с одним продуктом и сборщиком мусора template <class Product> class GCFactory { typedef std::list<Product *> Collection_T; public: GCFactory() {}; ~GCFactory() { typename Collection_T::reverse_iterator I; for (I = collection.rbegin(); I != collection.rend(); ++I) { delete *I; }; }; Product* pcreate() { // создание продукта; указатель Product *product = new Product(); collection.push_back(product); return product; }; Product& rcreate() { // создание продукта; ссылка Product * product = new Product(); collection.push_back(product); return *product; }; protected: Collection_T collection; }; // // **************************************** ********************************* // **************************************** ********************************* // "прокат" объектов // // предполагается, что все объекты являются "собственностью" класса-проката // template <class IdType, class ProductType> class Hire { typedef std::map<IdType, ProductType*> ProductMap_T; public: Hire() {}; ~Hire() { std::cout << "прокат сдыхает" << std::endl; typename ProductMap_T::iterator I; for (I = products_.begin(); I != products_.end(); ++I) if (I->second) delete I->second; }; ProductType* pcreate(IdType id) const { // "создание" продукта; ссылка const typename ProductMap_T::const_iterator& I = products_.find(id); return I->second; }; ProductType& rcreate(IdType id) const { // "создание" продукта; указатель const typename ProductMap_T::const_iterator& I = products_.find(id); return *(I->second); }; bool has_name(const IdType& id) const { const typename ProductMap_T::const_iterator& I = products_.find(id); return (I != products_.end()); }; protected: void registerProduct(IdType id, ProductType * product) { // регистрация продукта products_[id] = product; }; private: ProductMap_T products_; }; // /Hire // **************************************** ********************************* }; #endif /* FACTORY_HPP_ */ # ifndef SINGLETON_HPP_ # define SINGLETON_HPP_ namespace Singleton { template <class T> class Singleton : public T { private: static Singleton<T> *pInstance; Singleton<T>() : T() {}; Singleton(const Singleton&); Singleton operator=(const Singleton&); static void instanceCreate() { static Singleton<T> instance; pInstance = &instance; } public: static Singleton<T>& getInstance() { if (pInstance == 0) instanceCreate(); return *pInstance; }; }; }; # endif |
|
| 02.06.2009, 19:33 | |
|
Ответы с готовыми решениями:
1
Ошибка в куске кода
Что происходит в заданном куске кода? |
|
17 / 17 / 0
Регистрация: 14.02.2009
Сообщений: 86
|
|
| 02.06.2009, 20:10 | |
|
Как это работает как бы становится понятно только из того кода там где это работает
![]() А принцип работы отличаться от принципа работы простого лексера и парсера существенно не должен ...
0
|
|
| 02.06.2009, 20:10 | |
|
Помогаю со студенческими работами здесь
2
Пожалуйста, проверьте, есть ли ошибки в приведённом куске кода. Как объявить функцию main в данном куске кода? Связанный список. List, не могу найти ошибку в куске кода
Найти ошибки в куске кода и исправить их Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
|
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений.
9TO2GP2bpX4
a42b81fb172ffc12ca589c7898261ccb/
https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/
Слева синяя линия -. . .
|
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. .
Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
|
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла:
Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
|
|
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога
Финальные проекты на Си и на C++:
finish-text-sdl3-c. zip
finish-text-sdl3-cpp. zip
|
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
|
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo
Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло.
Но на выплатах по больничным это. . .
|
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
|