Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
ourlifeforus
Сообщений: n/a
#1

Хотел бы попросить помочь разобраться в куске кода - C++

02.06.2009, 19:33. Просмотров 436. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2009, 19:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Хотел бы попросить помочь разобраться в куске кода (C++):

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

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

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

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

Сортировка слиянием. В каком куске кода происходит сортировка и каким именно образом? - C++
Помогите, пожалуйста, разобраться. Подскажите в каком куске кода происходит сортировка и каким именно образом? #include &lt;iostream&gt; ...

Написать функцию вставки элемента в массив. Помочь разобраться - C++
Приветствую всех. Написать функцию вставки элемента в массив. Все элементы после него сдвигаются на один вправо, а последний элемент...

1
Night_Light
17 / 17 / 2
Регистрация: 14.02.2009
Сообщений: 86
02.06.2009, 20:10 #2
Как это работает как бы становится понятно только из того кода там где это работает
А принцип работы отличаться от принципа работы простого лексера и парсера существенно не должен ...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2009, 20:10
Привет! Вот еще темы с ответами:

Помочь разобраться с программой. Написать функцию вставки элемента в массив - C++
Здравствуйте. Можете помочь разобраться в программе? Ну хоть комментарии какие поставить.. Заранее спасибо. Написать функцию вставки...

Немогу разобраться в строчке кода! - C++
Программисты помогите понять эту строку кода while(b) b^=a^=b^=a%=b; Что делает этот while? а и б обычные целые числа.

Не могу разобраться . 14 строк кода - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &quot;VERYLONG.H&quot; #include &lt;string&gt; #include &lt;cstdlib&gt; using namespace std; int main...

Объясните,пожалуйста,что происходит в этом куске программы? - C++
Требуется динамическое выделение памяти под двухмерный массив с заполнением массива с клавиатуры. Можно подробнее про этот кусок: ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru