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

Не сложный вопросик!!! - C++

Восстановить пароль Регистрация
 
matq
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 16
08.06.2010, 23:38     Не сложный вопросик!!! #1
В базовом классе перегрузил operator<<, затем в производном переопределил. Как при использовании указать что бы выполнялся operator<< из производного класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2010, 23:38     Не сложный вопросик!!!
Посмотрите здесь:

C++ Небольшой вопросик
C++ Назрел вопросик разбить 0xF32A на 0xF3 и 0x2A
C++ массивы, есть вопросик
из Visual Basic в С++..маленький вопросик C++
C++ Маленький вопросик
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
832 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
09.06.2010, 01:05     Не сложный вопросик!!! #2
выложи код
matq
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 16
09.06.2010, 01:42  [ТС]     Не сложный вопросик!!! #3
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
#include<iostream>
#include<string>
#include<map>
#include<cctype>
#include<sstream>
 
 
#include <stdexcept>
#include "Rat.h"//базовый класс
#include "lr3.h"
 
#include "LR.h" // производный класс
using namespace rat;
 
 
int main(int argc, char* argv[])
{
 
    
    switch(argc){
        case 1:
            input = &cin;
            break;
        case 2:
            input = new istringstream(argv[1]);
            break;
        default:
            error("!!!!!!");
            return 1;
    }
    Rat<int> t(1);
    while(input)
    {
        get_token();
        if(curr_tok == END)
            break;
        if(curr_tok == PRINT)
            continue;
        t=expr(false);
        
 
        cout<<t<<'\n';          
       
       
    }
    if(input != &std::cin)
        delete input;
    return no_of_errors;
}
Добавлено через 34 секунды
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
#ifndef LR_H
#define LR_H
#include <stdexcept>
 
using namespace rat;
 
   template <class T>
   class LR: public Rat<T>
    {
         public:  
          void vivod (Rat<T> t); 
          template <class v>
          friend ostream &operator<<(ostream& out, Rat<v> &t);   
};
 
template <class v>
ostream &operator<<(ostream& cout, Rat<v> &t){                   
           if (t.y!=1 && t.x!=0){          
               cout<<t<<'\n';          
               }    
           else 
               if (t.x!=0){      
                     cout<<t.x<<'\n';
                }
               else  {
                     cout<<"0"<<'\n'; 
                     }
               return cout;
         }
 
#endif
Добавлено через 9 минут
БАЗОВЫЙ КЛАСС:
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
#ifndef Rat_H
#define Rat_H
#include <stdexcept>
 
 
 
using namespace std;
namespace rat{
          
        
template <class T>
    class Rat  
    {  
      
     public: 
              T x, y;
          Rat(T x, T y=1): x(x), y(y) {}; 
          T NOD (Rat<T> v);
          Rat<T> sokr (Rat<T> v); 
          Rat<T> pow (Rat<T> v, Rat<T> d);   
          template <class v>
          friend ostream &operator<<(ostream& out, Rat<v> &t);   
          template <class v>
          friend istream& operator>>(istream& in, Rat<v> &v);
        
    };  
        
template <class T>
Rat<T> operator+(Rat<T>  v, Rat<T>  w)  
{   
    if(v.y!=w.y){
    v.x=v.x*w.y+w.x*v.y;   
    v.y=v.y*w.y;        
    return v.sokr(v);
    }
    else
    v.x=v.x+w.x;   
    v.y=w.y;        
    return v.sokr(v);
}
 
template <class T>
Rat<T> operator-(Rat<T>  v, Rat<T>  w)  
{
    if(v.y!=w.y){  
    v.x=v.x*w.y-w.x*v.y;    
    v.y=v.y*w.y;    
    return v=v.sokr(v);}
    else if(v.x!=w.y){
            v.x=v.x-w.x;   
            v.y=w.y;        
            return v=v.sokr(v);
          }
          else return v;
        
}
 
template <class T>
Rat<T> operator*(Rat<T>  v, Rat<T>  w)  
{
    v.x=v.x*w.x;
    v.y=v.y*w.y;
    return v.sokr(v);
}
 
template <class T>
Rat<T> operator/(Rat<T>  v, Rat<T>  w) 
{
    v.x=v.x*w.y;
    v.y=v.y*w.x;
    return v.sokr(v);
    
}
 
template <class T>
Rat<T> operator^(Rat<T> v, Rat<T> d)
{   
return v.pow(v,d); 
}
 
template <class T>
Rat<T> Rat<T> :: pow (Rat<T> v, Rat<T> d){
if(!d.x) return 1;
else return v*pow(v,d.x-1);
}
 
 
 
template <class T>
Rat<T> Rat<T> :: sokr(Rat<T> v){ 
   T q;      
   q=v.NOD(v);     
   v.x=v.x/abs(q);
   v.y=v.y/abs(q);
   return v;
 }
 
template <class T>
T Rat<T> :: NOD(Rat<T> v) {
    v.x=abs(v.x);
   while ( v.x != v.y) {
      if (v.x > v.y) v.x -=v.y;
       else v.y -= v.x;
   }
  return abs(v.x);
 }
 
 template <class v>
ostream& operator<<(ostream& out, Rat<v> &t){
out<<t.x<<"/"<< t.y<<"="<<float(t.x)/float(t.y);
return out;
 }
 
   template <class v>
 istream& operator>>(istream& in, Rat<v> &e){
     char c;
     in>>e.x>>c>>e.y;
    return in;
}
 
 
}
 
 
 
#endif
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
09.06.2010, 05:09     Не сложный вопросик!!! #4
matq, код не разбирал, но думаю что тебе надо в базовом классе перегрузку операции сделать виртуальной, перегрузку в производном классе объявить также, только без спецификатора virtual и работать не с объектами классов, а с указателями на них.
matq
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 16
09.06.2010, 12:26  [ТС]     Не сложный вопросик!!! #5
А как обойтись без спецификатора virtual? что бы не изменять базовый класс..
_Eldar_
 Аватар для _Eldar_
44 / 29 / 3
Регистрация: 31.10.2009
Сообщений: 200
09.06.2010, 13:26     Не сложный вопросик!!! #6
поробуй приведение к типу указателя на объеку: например,
((производный класс* имя_указателя_на_объект))->перегруженный_метод()

Добавлено через 2 минуты
ну ясно понятно, этот способ подойдет, только если ты знаешь к какому типу приводить, а если на этапе комплиляции неизвестно к какому типу приводить, то надо использовать виртуальные методы

Добавлено через 4 минуты
ну а сам указатель можно объявить так:
базовый_класс * имя_указателя_на_объект;
имя_указателя_на_объект = new производный_класс;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2010, 15:17     Не сложный вопросик!!!
Еще ссылки по теме:

C++ маленький простенький вопросик...
Мааааленький такой вопросик C++
C++ маленький вопросик

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

Или воспользуйтесь поиском по форуму:
matq
0 / 0 / 0
Регистрация: 22.12.2009
Сообщений: 16
09.06.2010, 15:17  [ТС]     Не сложный вопросик!!! #7
Спасибо! с этим вроде разобрался. НО возникла новая проблема , теперь базовый класс boost/rational.hpp , переписал производный класс. Прога компилируется работает, но при выполнении первого ифа пишет ОШИБКА СЕГМЕНТИРОВАНИЯ. Подскажите в чем причина?
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
#ifndef LR_H
#define LR_H
#include <stdexcept>
 
   template <typename IntType>
   class LR: public boost::rational<IntType>
    {
         public:     
          template <typename v>
          friend ostream& operator<<(std::ostream& os,  boost::rational<v>& t);   
};
 
template <typename v>
std::ostream& operator<<(std::ostream& os, boost::rational<v>& t){                   
           if (t.denominator()!=1 && t.numerator()!=0){          
                os<<t<<'\n';          
               }    
           else 
               if (t.numerator()!=0){      
                  os<<t.numerator()<<'\n';
                }
               else  {
                     os<<"0"<<'\n'; 
                }
               return os;
}
 
#endif
Добавлено через 5 минут
Всем спасибо!!! Все уже исправил!!!!
Yandex
Объявления
09.06.2010, 15:17     Не сложный вопросик!!!
Ответ Создать тему
Опции темы

Текущее время: 21:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru