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

Виртуальная функция и возвращаемое значение - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Разрешение коллизий методом цепочек http://www.cyberforum.ru/cpp-beginners/thread955243.html
Здравствуйте. Мне нужно сделать хэш-таблицу с хэшированием умножением и разрешением коллизий методом цепочек с наложением пространства записей на пространство ссылок, т.е. чтобы массив содержал сами элементы цепочек, и адреса указателей на следующие элементы ссылались на сам массив. Как сделать обычный метод цепочек я представляю, а что делать в этом случае?
C++ Преобразовать строку, удалив каждый символ * и повторив каждый символ, отличный от * Дана строка. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от *. Помогите решить, писал тоже самое на Паскале в ++ что то не получается) http://www.cyberforum.ru/cpp-beginners/thread955218.html
Ошибка в программе C++
Доброго времени суток. Только недавно начал пробовать что то ваять на С, пока все получалось до этого момента. #include "stdafx.h" #include <iostream> using namespace std; int main() { setlocale(0, ""); int a,b,c,d; d=1;
"вычислить" элементы вектора C++
Есть вектор: std::vector<char> vec; Содержащий , например , vec = 1, vec = +, vec = 2, vec = *, vec = 3. Можно ли элементы вектора собрать в int result = 1 + 2 * 3 и вычислить?
C++ Структуры http://www.cyberforum.ru/cpp-beginners/thread955206.html
в справочной автовокзала хранится расписание движения автобусов. Для каждого рейса указаны его номер, тип автобуса, пунт назначения, время отбытия и прибытия. Вывести информацию о рейсы которыми можно воспользоваться для прибытия в пункт назначения раньше заданного часу.Пункт назначения и время вводятся с клавиатуры.
C++ счетчик цикла for Есть задача из Прата глава 5 № 4. Дафна инвестировала $100 под простые 10%. Другими словами, ежегодно инвестиция должна приносить 10% инвестированной суммы, т.е. $10 каждый год:прибыль = 0,10 х исходный баланс. В то же время Клео инвестировала $100 под сложные 5%. Это значит, что прибыль составит 5% от текущего баланса, включая предыдущую накопленную прибыль:прибыль = 0,05 х текущий баланс.... подробнее

Показать сообщение отдельно
Рики
6 / 6 / 1
Регистрация: 27.02.2013
Сообщений: 23
15.09.2013, 23:00     Виртуальная функция и возвращаемое значение
Этот код нужен для разбора арифметических выражений. Пишем что-то типа "1,456+654,5*65.45", после чего в стек помещаются числа типа float и операторы типа char. Для этого создан виртуальный класс "Token", наследниками которого являются Operator и Number. Программа служит для разбора строки, и подсчета результата.

Проблема с виртуальными функциями. VS 2012 выдает:
error LNK2001: неразрешенный внешний символ ""public: virtual char __thiscall Number::getOperator(void)" (?getOperator@Number@@UAEDXZ)"
error LNK2001: неразрешенный внешний символ ""public: virtual float __thiscall Operator::getNumber(void)" (?getNumber@Operator@@UAEMXZ)"
сокращенно код
Кликните здесь для просмотра всего текста
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
// parse.cpp
#include <iostream>
#include <cstring>                   //for strlen(), etc
#include <stdlib.h> 
using namespace std;
const int LEN = 80;    //length of expressions, in characters
const int MAX = 40;    //size of stack
////////////////////////////////////////////////////////////////
  class Token                      // Абстрактный базовый класс
    {
    public:
      virtual void showOperNumber()=0; // чистая виртуальная
      virtual char getOperator()=0;             // функция
      virtual float getNumber()=0; 
 
      
    };
////////////////////////////////////////////////////////////////
  class Operator : public Token
    {
    private:
      char oper;             // Операторы +, –, *, /
    public:
      Operator(char c): oper(c)      // конструктор устанавливает значение
        {}
      void showOperNumber()    // получить значение
        {cout<<oper<<endl; }
      virtual float getNumber();
      char getOperator()
        {return oper;}
     
    };
////////////////////////////////////////////////////////////////
  class Number : public Token
    {
    private:
      float fnum;            // число
    public:
      Number(float f): fnum(f)         // конструктор устанавливает значение
         {}
      void showOperNumber()     // получить значение
        {cout<<fnum<<endl;}
      float getNumber()
        {return fnum;}
      virtual char getOperator();
    };
////////////////////////////////////////////////////////////////////
class Stack
   {
   private:
      Token* atoken[100];    //содержит типы Operator* и Number*                  
      int top;                       //number of top of stack
   public:
      Stack()                        //constructor
         { top = 0; }
      void push(Token* var)            //put char on stack
         { atoken[++top] = var; }
      Token* pop()                     //take char off stack
         { return atoken[top--]; }
      int gettop()                   //get top of stack
         { return top; }
   };
////////////////////////////////////////////////////////////////
int main()
   {
   setlocale (LC_ALL, "russian");
   Stack s;
   char stroka [LEN]="5,093+5,032";                          //char from input string
   char chifra [LEN];  
   char Ch;                     
   float n;
   float lastval;
   char lastop;
   //cout<<" Введите выражение. ";
   //cin>>stroka;
   int len = strlen(stroka);
   int j=0;
   int i=0; 
   Token* atoken[4] = {new Operator('+'), new Number(123.123),
                       new Operator('-'), new Number(456.456)};
   for(int k=0; k<4; k++)
        atoken[k]->showOperNumber();
 
   system("pause");
   return 0;
   }


Полностью:
Кликните здесь для просмотра всего текста
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
// parse.cpp
#include <iostream>
#include <cstring>                   //for strlen(), etc
#include <stdlib.h> 
using namespace std;
const int LEN = 80;    //length of expressions, in characters
const int MAX = 40;    //size of stack
////////////////////////////////////////////////////////////////
  class Token                      // Абстрактный базовый класс
    {
    public:
      virtual void showOperNumber()=0; // чистая виртуальная
      virtual char getOperator()=0;             // функция
      virtual float getNumber()=0; 
 
      
    };
////////////////////////////////////////////////////////////////
  class Operator : public Token
    {
    private:
      char oper;             // Операторы +, –, *, /
    public:
      Operator(char c): oper(c)      // конструктор устанавливает значение
        {}
      void showOperNumber()    // получить значение
        {cout<<oper<<endl; }
      virtual float getNumber();
      char getOperator()
        {return oper;}
     
    };
////////////////////////////////////////////////////////////////
  class Number : public Token
    {
    private:
      float fnum;            // число
    public:
      Number(float f): fnum(f)         // конструктор устанавливает значение
         {}
      void showOperNumber()     // получить значение
        {cout<<fnum<<endl;}
      float getNumber()
        {return fnum;}
      virtual char getOperator();
    };
////////////////////////////////////////////////////////////////////
class Stack
   {
   private:
      Token* atoken[100];    //содержит типы Operator* и Number*                  
      int top;                       //number of top of stack
   public:
      Stack()                        //constructor
         { top = 0; }
      void push(Token* var)            //put char on stack
         { atoken[++top] = var; }
      Token* pop()                     //take char off stack
         { return atoken[top--]; }
      int gettop()                   //get top of stack
         { return top; }
   };
////////////////////////////////////////////////////////////////
int main()
   {
   setlocale (LC_ALL, "russian");
   Stack s;
   char stroka [LEN]="5,093+5,032";                          //char from input string
   char chifra [LEN];  
   char Ch;                     
   float n;
   float lastval;
   char lastop;
   //cout<<" Введите выражение. ";
   //cin>>stroka;
   int len = strlen(stroka);
   int j=0;
   int i=0; 
   Number* ptrN;
   Operator* ptrO;
   for(j; j<len; j++)          //for each input character
   {
        if (stroka[j]>='0' && stroka[j]<='9' || stroka[j]==',')
        {
            while (stroka[j]>='0' && stroka[j]<='9' || stroka[j]==',')
            {
                chifra [i]=stroka[j];
                j++; i++;
                n = atof(chifra); 
            }
            ptrN = new Number(n);
            s.push(ptrN);    
        }
        else
        if(stroka[j]=='+' || stroka[j]=='-' || stroka[j]=='*' || stroka[j]=='/')
        {
            Ch = stroka[j];
            if (s.gettop()==1)
            {
                ptrO = new Operator(Ch);
                s.push(ptrO);   
            }
            else
            {
                lastval=s.pop()->getNumber();
                lastop=s.pop()->getOperator();
                if( (stroka[j]=='*' || stroka[j]=='/') && (lastop=='+' || lastop=='-') )
                {
                    ptrO = new Operator(lastop);
                    s.push(ptrO);   
                    ptrN = new Number(lastval);
                    s.push(ptrN);   
               }
               else                     //in all other cases
               {
               switch(lastop)        //do last operation
                  {                  //push result on stack
                  case '+': ptrN = new Number(s.pop()->getNumber() + lastval); break;
                  case '-': ptrN = new Number(s.pop()->getNumber() - lastval); break;
                  case '*': ptrN = new Number(s.pop()->getNumber() * lastval); break;
                  case '/': ptrN = new Number(s.pop()->getNumber() / lastval); break;
                  default:  cout << "\nUnknown oper"; exit(1);
                  }  //end switch
               }  //end else, in all other cases
            ptrO = new Operator(stroka[j]);
            s.push(ptrO);              //put current op on stack
            }  //end else, not first operator
         }  //end else if, it's an operator
   
      else                           //not a known character
         { cout << "\nUnknown input character"; exit(1); }
   }
//--------------------------------------------------------------
 
    while(s.gettop() > 1)
      {
      lastval = s.pop()->getNumber();//get previous value
      switch( s.pop()->getOperator() )              //get previous operator
         {                           //do operation, push answer
         case '+': new Number(s.pop()->getNumber() + lastval); break;
         case '-': new Number(s.pop()->getNumber() - lastval); break;
         case '*': new Number(s.pop()->getNumber() * lastval); break;
         case '/': new Number(s.pop()->getNumber() / lastval); break;
         default:  cout << "\nUnknown operator"; exit(1);
         }  //end switch
      }  //end while
   s.pop()->showOperNumber();
   system("pause");
   return 0;
   }


как правильно описать ?
C++
1
virtual char getOperator()=0; virtual float getNumber()=0;
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru