Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2009, 19:33
Ответы с готовыми решениями:

Ошибка в куске кода
Почему в массив не добавляется вводимое число??? include &quot;stdafx.h&quot; #include &lt;time.h&gt; #include &lt;conio.h&gt; #include...

Что происходит в куске кода?
Есть класс class Figure { public: virtual ~Figure() {} //деструктор класса virtual void print() const = 0; virtual double...

Что происходит в заданном куске кода?
Здравствуйте, просто объясните пожалуйста этот кусок кода, что тут происходит. Это алгоритм преобразования серийного номера в нормальный...

1
17 / 17 / 0
Регистрация: 14.02.2009
Сообщений: 86
02.06.2009, 20:10
Как это работает как бы становится понятно только из того кода там где это работает
А принцип работы отличаться от принципа работы простого лексера и парсера существенно не должен ...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.06.2009, 20:10
Помогаю со студенческими работами здесь

Пожалуйста, проверьте, есть ли ошибки в приведённом куске кода.
... unsigned short many = 10, people = 5; unsigned long int peep = 5, zood = 3; const unsigned long int peep = 10; ...

Как объявить функцию main в данном куске кода?
как объявить функцию main в данном куске кода? int len; char* str = &quot;gpDWtrjHs5Oa2YSFiaTeoQ==&quot;; string res = base64_decode(str,...

Связанный список. List, не могу найти ошибку в куске кода
Программа работает, но работает не правильно. Суть функции, создается список, заполняется, потом надо по нужным условиям найти элементы и...

Хотел бы попросить помочь мне перевести программу из Visual Basic в qBasic. Или помочь найти конвертер...
Добрый день! Хотел бы попросить помочь мне перевести программу из Visual Basic в qBasic. Или помочь найти конвертер... Sub My() Dim i...

Найти ошибки в куске кода и исправить их
.data byteVal. .db. 1,2,3,4 wordVal. dw 1000h,2000h,3000h,4000h ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
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. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru