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

Пишем свой интерпретатор языка BASIC - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Меню и список http://www.cyberforum.ru/cpp-beginners/thread41194.html
Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились: Введите элемент и номер. вот сам код: #ifndef __list_h #define __list_h #include <iostream>
C++ Здравствуйте! Не могу поместить class в один файл с программой. file.hpp #include "Cat.hpp" // здесь классы "2)" Cat::Cat(int initialAge) { itsAge = initialAge; } Cat::~Cat() { http://www.cyberforum.ru/cpp-beginners/thread41186.html
Массивы строк C++
Привет всем! Задан массив строк. Как узнать который символ встечаетса найбольшое количество раз в етом массиве?
C++ вывод на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер
Please, help me!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо исправить код, чтоб фигуры не исчезали за экран (т.е. 640х460) и были компактным набором, т.е. двигались неменяя своего положения относительно друг друга и стукаясь об стенку экрана меняли свое...
C++ Округление дробного числа до целого в большую сторону. http://www.cyberforum.ru/cpp-beginners/thread41139.html
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) программа не округляет это число (в большую сторону) до 4. Перелопатил тонны литературы, но пропустил или не нашёл этого, большая просьба написать функцию которая могла бы это делать, или способ какой.
C++ Код из Delphi в C++ Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; var d:array of longint; procedure c; var a,b,i:longint; подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
09.07.2009, 23:47  [ТС]     Пишем свой интерпретатор языка BASIC
Я тут подумал,не лучше ли будет для переменных организовать свой класс,в который,в свою очередь,будет содержать в себе экземпляр класса констант?То есть,когда потребуется выполнить
PureBasic
1
LET a = 1
То просто будет создаваться экземпляр класса переменных,а в конструктор констант будет передаваться строка,и вся ответственность за типизацию,инициализацию и прочее уже ляжет на реализацию класса.Единственная возможная проблема мне видится с видимостью переменных,что данный объект не будет видно из функций,вызываемых далее,а если создавать какой-то глобальный экземпляр,то встаёт вопрос сколько их нужно...Может тут namespace как-то спасёт?
Еще небольшая мелочь в оформлении-проектировании: В syntax_parser.h у меня записано:
syntax_parser.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef SYNTAX_PARSER_H_INCLUDED
#define SYNTAX_PARSER_H_INCLUDED
 
 
 
   // Contain all types of
   // constants,that constructor
   // will get in create of
   // class object.
   enum Types {
       CONST_VAL_INT,   // Тип константы,передаваемый
       CONST_VAL_FLOAT  // конструктору класса
   };
 
   extern Types VarType;
   
   #include "const_class.h"
   class ConstVar;
 
   extern ConstVar syntax_parserPrimary();
 
#endif // SYNTAX_PARSER_H_INCLUDED

То есть я делаю тобой предложенный enum частью синтаксического анализатора(ну не в класс констант же его включать). Мне не нравится,что пришлось так неэстетично записать включение "const_class.h" прямо посередине header-а,как-то не смотрится,да и запись class ConstVar; тоже не к месту.Это всё потому,что enum Types используется в классе ConstVar,который и подключается с помощью "const_class.h".Как бы так сделать поэлегантнее,чтобы в то же время сохранить некий порядок и структуру разделения? Модульное программирование для меня пока не совсем ясно,вот такие ньюансы немного сбиваю с толку.На всякий случай вот код(я надеюсь компилить его не нужно):
syntax_parser.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <cstdlib>
#include <fstream>
#include <iostream>
#include "syntax_parser.h"
#include "parser.h"
#include "debugger.h"
 
//
    using std::ofstream;
    using std::cout;
    using std::endl;
 
    Types VarType;
 
 
    ConstVar syntax_parserPrimary()
    {
        switch (parser_GetToken ())
        {
            case TOKEN_CONST_INT: {
 
                ConstVar int_x(::parser_CurTokenStr,CONST_VAL_INT);
 
                return int_x;
            }
            case TOKEN_CONST_FLOAT: {
 
                ConstVar float_x(::parser_CurTokenStr,CONST_VAL_FLOAT);
 
                return float_x;
            }
            case TOKEN_IDENT: {
                
                ;
            }
            default: ;
                //Error
        }
    }

const_class.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#ifndef CONST_CLASS_H_INCLUDED
#define CONST_CLASS_H_INCLUDED
 
 
#include "syntax_parser.h"
#include "parser.h"
#include <string>
#include <iostream>
 
 
 
 
   class ConstVar
   {
       private:
              // is_float will be used for
              // setting type of the constant
              // 0 means integer constant
              bool is_float; // плавающая или целая
 
              // "Pure optimisation"
              // Depends of is_float
              union
              {
                  long ival; // здесь храним целое значение, если константа целая
                  double fval; //  здесь храним плавающее значение, если константа плавающая
              } constant;
 
       public:
            /** @brief Costructor receive string from parser
             *  and turn it into variable.The type of variable
             *  depends on VarType value(syntax_parser.h).*/
             ConstVar(const std::string parser_CurToken,Types VarType);
 
            /** Standart destructor */
            ~ConstVar(){};
 
            /** Operators overloading */
             ConstVar operator +  (const ConstVar& prev);
             ConstVar operator -  (const ConstVar& prev);
             ConstVar operator *  (const ConstVar& prev);
             ConstVar operator /  (const ConstVar& prev);
             ConstVar operator =  (const ConstVar& prev);
 
             bool Is_Float() const {return is_float;};
             long Get_ival() const {return constant.ival;};
             double Get_fval() const {return constant.fval;};
   };
 
 
   std::ostream& operator << (std::ostream& os,const ConstVar& curr);
 
#endif // CONST_CLASS_H_INCLUDED

const_class.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "const_class.h"
#include "syntax_parser.h"
#include <iostream>
#include <cstdlib>
#include <ostream>
 
//
 
   using std::string;
   using std::cout;
 
   ConstVar::ConstVar(const std::string parser_CurToken, Types VarType)
   {
       switch (VarType)
       {
           case CONST_VAL_INT: {
 
               is_float = 0;
 
               constant.ival = atol(parser_CurToken.c_str());
 
           break;
           }
           case CONST_VAL_FLOAT: {
 
               is_float = 1;
 
               constant.fval = atof(parser_CurToken.c_str());
 
           break;
           }
           default:; // Error;
       }
   }
 
 
   ConstVar ConstVar::operator = (const ConstVar& prev)
   {
       if (is_float == 1&&is_float == prev.Is_Float())
       {
           constant.fval = prev.Get_fval();
           return *this;
       }
       else
         if (is_float == 0&&is_float == prev.Is_Float())
         {
             constant.ival = prev.Get_ival();
             return *this;
         }
         else ;
            // Types messing Error?
         return *this;
   }
 
 
   ConstVar ConstVar::operator + (const ConstVar& prev)
   {
       if (is_float == 1&&is_float == prev.Is_Float())
       {
           constant.fval += prev.Get_fval();
           return *this;
       }
       else
         if (is_float == 0&&is_float == prev.Is_Float())
         {
             constant.ival += prev.Get_ival();
             return *this;
         }
         else ;
            // Types messing Error?
         return *this;
   }
 
 
   ConstVar ConstVar::operator - (const ConstVar& prev)
   {
       if (is_float == 1&&is_float == prev.Is_Float())
       {
           constant.fval += prev.Get_fval();
           return *this;
       }
       else
         if (is_float == 0&&is_float == prev.Is_Float())
         {
             constant.ival -= prev.Get_ival();
             return *this;
         }
         else ;
            // Types messing Error?
         return *this;
   }
 
 
   ConstVar ConstVar::operator * (const ConstVar& prev)
   {
       if (is_float == 1&&is_float == prev.Is_Float())
       {
           constant.fval *= prev.Get_fval();
           return *this;
       }
       else
         if (is_float == 0&&is_float == prev.Is_Float())
         {
             constant.ival *= prev.Get_ival();
             return *this;
         }
         else ;
            // Types messing Error?
         return *this;
   }
 
 
   ConstVar ConstVar::operator / (const ConstVar& prev)
   {
       if (is_float == 1&&is_float == prev.Is_Float())
       {
           constant.fval /= prev.Get_fval();
           return *this;
       }
       else
         if (is_float == 0&&is_float == prev.Is_Float())
         {
             constant.ival /= prev.Get_ival();
             return *this;
         }
         else ;
            // Types messing Error?
         return *this;
   }
 
 
   std::ostream& operator << (std::ostream& output_stream,const ConstVar& curr)
   {
       switch (curr.Is_Float())
       {
           case 1:
 
                output_stream << curr.Get_fval();
                return cout;
           break;
           case 0:
 
                output_stream << curr.Get_ival();
                return cout;
           break;
           default:;
                //Something
           return cout;
       }
   }


Добавлено через 29 минут 46 секунд
P.S. Сейчас увидел только: я по ходу ошибся в перегрузке операторов,возвращать нужно было this а не *this,так? Просто я на лету делал,пришлось попутно читать про перегрузку ,union и т.д.
 
Текущее время: 04:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru