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

Вывод из класса наследника - C++

Войти
Регистрация
Восстановить пароль
 
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
11.11.2010, 15:22     Вывод из класса наследника #1
У меня получается вывод из главного класса, а когда вывожу через функцию из класса наследника выдает ошибку, из-за чего так???? хоты вывожу по тому же принципу как и из главного класса
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
#include "stdafx.h"
#include "tchar.h"
#include "string.h"
#include "stdio.h"
#include "locale.h"
#include "iostream"
#include "conio.h"
using namespace std;
class KOMPLEX
{       private:
                double Re;
                double Im;
        public:
                KOMPLEX (double e=0, double y=0)
                {Re=e; Im=y;};
                KOMPLEX  operator -(KOMPLEX f)
                { KOMPLEX Z(Re - f.Re, Im - f.Im);
                         return Z;      };
        friend KOMPLEX  operator +(KOMPLEX a, KOMPLEX f)
                {  KOMPLEX  Z(a.Re + f.Re, a.Im + f.Im);
             return Z;};
                KOMPLEX  operator *(KOMPLEX f)
                {  KOMPLEX Z(Re * f.Re - Im * f.Im, Re * f.Im + Im * f.Re);
                         return Z; };
                KOMPLEX  operator /(KOMPLEX f)
                { KOMPLEX Z((Re * f.Re + Im * f.Im) / (f.Re * f.Re + f.Im * f.Im),(Im * f.Re - Re * f.Im) / (f.Re * f.Re + f.Im * f.Im));         
                         return Z;
                };
                KOMPLEX   sopr()
                {KOMPLEX Z(Re, -1 * Im);
                        return Z;};
        void znak() 
                {   if (Im<0) { printf("%lf %lfi \n", Re, Im);}
                         else printf("%lf + %lfi \n", Re, Im);};
         void Get(double a, double b)
                {
                        Re = a;
                        Im = b;
                    printf ("%lf + i%lf \n", Re, Im);
                }                                                   
                KOMPLEX KOMPLEX::operator ++(int)
                     {
                        KOMPLEX u(0,0);
                        u=*this;
                        Re++;
                        Im++;
                         return u;
                     };
                KOMPLEX KOMPLEX::operator --(void)
                    {
                        KOMPLEX u(0,0);
                        u=*this;
                        Re--;
                        Im--;
                        return u;
                     };
};
class Vector: public KOMPLEX
{
private:
                double Re;
                double Im;
public:
        KOMPLEX::operator --;
        KOMPLEX::operator ++;
        KOMPLEX::operator *;
        KOMPLEX::operator -;
        void vivod( double Re, double  Im)
        {
        cout<<"\n Вывод класса Vector:" <<'(' << Re <<','<< Im << ')'<<" \n";
        }
        void vivod2(void)
        {if (Im<0) cout<<"\n Вывод класса Vector:" <<'(' << Re <<','<< Im << ')'<<" \n";
        else cout<<"\n Вывод класса Vector:" <<'(' << Re <<','<< -Im << ')'<<" \n";
        }               
};
int _tmain()
{
setlocale (LC_ALL, "Russian");
KOMPLEX a, f;
Vector t, h;
        int w;
        double Re;
        double Im;
        int q=1;
                do 
                {
        printf("Введите  1оe числo \n ");
                scanf_s("%lf %lf", &Re, &Im);
cout<<" Вывод класса KOMPLEX :" ;
                a.Get(Re, Im);
                t.vivod(Re, Im);
        printf(" \n Введите 2ое число \n ");
                scanf_s("%lf %lf", &Re, &Im);
cout<<" Вывод класса KOMPLEX :" ;
            f.Get(Re, Im);
            h.vivod(Re, Im);
            printf(" \n Введите знак действи который хотите совершить -(1), +(2), *(3), /(4)  или  s(5) -  что будет означать что вам необходимо найти сопряженное  для 1ого комплексного числа: \n ");
        cin >> w; 
        printf (" Ответ \n");
        switch (w)
        {
                case 1:
                    (a-f).znak();
                        break;
                case 2:
                    (a+f).znak();
                                        Vector (t-h).vivod2();
                        break;
                case 3:
                    (a*f).znak();                    
                        break;
                case 4:
                    (a/f).znak();                                 
                        break;
                case 5:
                    a.sopr();
                    f.sopr()
                        ;
                       break;
                                default: cout << "error\n";
        };
                printf ("Хотите повторить запрос нажмите 1, выйти нажмите 0 \n");
                scanf_s ("%d", &q);
                }
                while (q==1);
            system("pause");
        exit(0);
        _getch();
        return 0;
}
C++
1
2
3
4
5
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(107) : error C2440: <function-style-cast>: невозможно преобразовать 'KOMPLEX' в 'Vector'
        Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(107) : error C2228: выражение слева от ".vivod2" должно представлять класс, структуру или объединение
Журнал построения был сохранен в "file://c:\Documents and Settings\1\Мои документы\Visual Studio 2008\Projects\лдщзшщзщощз\лдщзшщзщощз\Debug\BuildLog.htm"
лдщзшщзщощз - ошибок 2, предупреждений 0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2010, 15:22     Вывод из класса наследника
Посмотрите здесь:

C++ Как правильно записать наследника от такого класса?
Не работает конструктор наследника класса C++
C++ создать метод доступа к функциям класса-наследника
Вызов виртуального метода класса наследника из вектора C++
C++ Объявление наследника шаблонного класса
Конструктор класса наследника C++
C++ Создание экземпляра для наследника абстрактного класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sudoki
124 / 64 / 1
Регистрация: 19.04.2010
Сообщений: 196
11.11.2010, 16:31     Вывод из класса наследника #2
Цитата Сообщение от White Luna Посмотреть сообщение
class KOMPLEX
{ * * * private:
* * * * * * * * double Re;
* * * * * * * * double Im;
Объявите их не private а protected и все будет нормально.
Из за этого Вы не можете пользоваться этими переменными в классе наследнике

Добавлено через 1 минуту
Цитата Сообщение от White Luna Посмотреть сообщение
class Vector: public KOMPLEX
{
private:
* * * * * * * * double Re;
* * * * * * * * double Im;
из этого класса можно убрать эти переменные

Добавлено через 3 минуты
Как то слишком мудренно все написано.

Добавлено через 16 минут
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
#include "stdafx.h"
#include "tchar.h"
#include "string.h"
#include "stdio.h"
#include "locale.h"
#include "iostream"
#include "conio.h"
using namespace std;
class Complex
{       protected:
                double Re;
                double Im;
        public:
                Complex() : Re(0), Im(0) {};
                Complex (double re, double im) : Re(re), Im(im) {};
                Complex&  operator -(const Complex &right)
                {
                    Re-=right.Re;
                    Im-=right.Im;
                    return *this;      
                };
                
                Complex&  operator +(const Complex &right)
                {
                    Re+=right.Re;
                    Im+=right.Im;
                    return *this;      
                };              
                    
                friend Complex  operator +(const Complex &left, const Complex &right)
                {
                    return Complex(left.Re+right.Re, left.Im+right.Im);
                };
                
                Complex&  operator *(const Complex& right)
                {
                    double _re = Re;
                    double _im = Im;
                    Re = _re*right.Re-_im*right.Im;
                    Im = _re*right.Im+_im*right.Re;
                    return *this;
                };
                
                Complex& operator /(const Complex& right)
                {
                    double _re = Re;
                    double _im = Im;
                    double d = right.Re*right.Re+right.Im*right.Im;
                    Re = (_re*right.Re+_im*right.Im)/d;
                    Im = (_im*right.Re-_re*right.Im)/d;
                    return *this;
                };
                
                Complex sopr()
                {
                    return Complex(Re, -Im);
                }
                
                double Real() const {return Re;};
                double Image() const {return Im;};
                
                //и так далее пока все нужные функции не будут добавлены
};
 
class Vector: public Complex
{
public:
    Vector(): Complex() {};
    Vector(double re, double im) : Complex(re, im) {};
    
    //Здесь реализовываешь доп функционал
                           
};
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
11.11.2010, 22:16  [ТС]     Вывод из класса наследника #3
все равно та же ошибка выдается, даж есл исправить как ты сказал

Добавлено через 1 час 38 минут
и из-за чего такая ошибка может быть?

Добавлено через 3 часа 41 минуту
яс, никто не знает, жалко
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
11.11.2010, 22:47     Вывод из класса наследника #4
Т.е. вы считаете что это нормально, да?

C++
1
Vector (t-h).vivod2();
C++
1
(t-h).vivod2
тогда уж. Но я бы посоветовал записать в отдельную переменную...
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
11.11.2010, 23:33  [ТС]     Вывод из класса наследника #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Т.е. вы считаете что это нормально, да?

C++
1
Vector (t-h).vivod2();
C++
1
(t-h).vivod2
тогда уж. Но я бы посоветовал записать в отдельную переменную...
я не считаю, что это норм, просто учительница (практику ведет у нас ток с прибабахом) сказала так попробовать,
как отдельную переменную мож пояснить, я тебя не поняла что ты под этим подразумеваешь
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
11.11.2010, 23:39     Вывод из класса наследника #6
White Luna, VECTOR s=t-h;
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
11.11.2010, 23:57  [ТС]     Вывод из класса наследника #7
ошибок стало еще больше
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(104) : error C2440: инициализация: невозможно преобразовать 'KOMPLEX' в 'Vector'
        Ни один конструктор не смог принять исходный тип, либо разрешение перегрузки конструктора неоднозначно
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(108) : error C2360: пропуск инициализации 'z' из-за метки 'case'
        c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(104): см. объявление 'z'
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(111) : error C2360: пропуск инициализации 'z' из-за метки 'case'
        c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(104): см. объявление 'z'
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(114) : error C2360: пропуск инициализации 'z' из-за метки 'case'
        c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(104): см. объявление 'z'
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(117) : error C2360: пропуск инициализации 'z' из-за метки 'case'
        c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(104): см. объявление 'z'
c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(122) : error C2361: пропуск инициализации 'z' из-за метки 'default'
        c:\documents and settings\1\мои документы\visual studio 2008\projects\лдщзшщзщощз\лдщзшщзщощз\лдщзшщзщощз.cpp(104): см. объявление 'z'
Журнал построения был сохранен в "file://c:\Documents and Settings\1\Мои документы\Visual Studio 2008\Projects\лдщзшщзщощз\лдщзшщзщощз\Debug\BuildLog.htm"
лдщзшщзщощз - ошибок 6, предупреждений 0
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
12.11.2010, 00:01     Вывод из класса наследника #8
C++
1
2
3
                case 2:
                                        (a+f).znak();
                                        (t-h).vivod2();
Елки палки, а где перегрузка для минуса для вектора???
Именно для вектора. Ибо перегрузка для KOMPLEX возвращает объект типа KOMPLEX, а вам нужен Vector
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
12.11.2010, 00:02  [ТС]     Вывод из класса наследника #9
C++
1
2
3
4
5
 case 1:
                    (a-f).znak();
                    Vector z=(t-h);
                z.vivod2();
                        break;
я лишь 2 строчки добавила
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
12.11.2010, 00:03     Вывод из класса наследника #10
White Luna, Нужна перегрузка - для Vector-а
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
12.11.2010, 00:04  [ТС]     Вывод из класса наследника #11
Елки палки, а где перегрузка для минуса для вектора???
oй, когда код копировала тут не туда вставила, вот код щас который есть полностью
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
#include "stdafx.h"
#include "tchar.h"
#include "string.h"
#include "stdio.h"
#include "locale.h"
#include "iostream"
#include "conio.h"
using namespace std;
class KOMPLEX
{       protected:
                double Re;
                double Im;
        public:
                KOMPLEX (double e=0, double y=0)
                {Re=e; Im=y;};
                KOMPLEX  operator -(KOMPLEX f)
                { KOMPLEX Z(Re - f.Re, Im - f.Im);
                         return Z;      };
        friend KOMPLEX  operator +(KOMPLEX a, KOMPLEX f)
                {  KOMPLEX  Z(a.Re + f.Re, a.Im + f.Im);
             return Z;};
                KOMPLEX  operator *(KOMPLEX f)
                {  KOMPLEX Z(Re * f.Re - Im * f.Im, Re * f.Im + Im * f.Re);
                         return Z; };
                KOMPLEX  operator /(KOMPLEX f)
                { KOMPLEX Z((Re * f.Re + Im * f.Im) / (f.Re * f.Re + f.Im * f.Im),(Im * f.Re - Re * f.Im) / (f.Re * f.Re + f.Im * f.Im));         
                         return Z;
                };
                KOMPLEX   sopr()
                {KOMPLEX Z(Re, -1 * Im);
                        return Z;};
        void znak() 
                {   if (Im<0) { printf("%lf %lfi \n", Re, Im);}
                         else printf("%lf + %lfi \n", Re, Im);};
         void Get(double a, double b)
                {
                        Re = a;
                        Im = b;
                    printf ("%lf + i%lf \n", Re, Im);
                }                                                   
                KOMPLEX KOMPLEX::operator ++(int)
                     {
                        KOMPLEX u(0,0);
                        u=*this;
                        Re++;
                        Im++;
                         return u;
                     };
                KOMPLEX KOMPLEX::operator --(void)
                    {
                        KOMPLEX u(0,0);
                        u=*this;
                        Re--;
                        Im--;
                        return u;
                     };
};
class Vector: public KOMPLEX
{
public:
        KOMPLEX::operator --;
        KOMPLEX::operator ++;
        KOMPLEX::operator *;
        KOMPLEX::operator -;
        void vivod( double Re, double  Im)
        {
        cout<<"\n Вывод класса Vector:" <<'(' << Re <<','<< Im << ')'<<" \n";
        }
        void vivod2(void)
        {if (Im<0) cout<<"\n Вывод класса Vector:" <<'(' << Re <<','<< Im << ')'<<" \n";
        else cout<<"\n Вывод класса Vector:" <<'(' << Re <<','<< -Im << ')'<<" \n";
        }               
};
int _tmain()
{
setlocale (LC_ALL, "Russian");
KOMPLEX a, f;
Vector z, t, h;
        int w;
        double Re;
        double Im;
        int q=1;
                do 
                {
        printf("Введите  1оe числo \n ");
                scanf_s("%lf %lf", &Re, &Im);
cout<<" Вывод класса KOMPLEX :" ;
                a.Get(Re, Im);
                t.vivod(Re, Im);
        printf(" \n Введите 2ое число \n ");
                scanf_s("%lf %lf", &Re, &Im);
cout<<" Вывод класса KOMPLEX :" ;
            f.Get(Re, Im);
            h.vivod(Re, Im);
            printf(" \n Введите знак действи который хотите совершить -(1), +(2), *(3), /(4)  или  s(5) -  что будет означать что вам необходимо найти сопряженное  для 1ого комплексного числа: \n ");
        cin >> w; 
        printf (" Ответ \n");
        switch (w)
        {
                case 1:
                    (a-f).znak();
                    Vector z=(t-h);
                z.vivod2();
                        break;
                case 2:
                    (a+f).znak();
                        break;
                case 3:
                    (a*f).znak();                    
                        break;
                case 4:
                    (a/f).znak();                                 
                        break;
                case 5:
                    a.sopr();
                    f.sopr()
                        ;
                       break;
                                default: cout << "error\n";
        };
                printf ("Хотите повторить запрос нажмите 1, выйти нажмите 0 \n");
                scanf_s ("%d", &q);
                }
                while (q==1);
            system("pause");
        exit(0);
        _getch();
        return 0;
}
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
12.11.2010, 00:04     Вывод из класса наследника #12
White Luna, Да нет тут перегрузки - для вектора. Только для комплекс.
White Luna
 Аватар для White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
12.11.2010, 00:06  [ТС]     Вывод из класса наследника #13
Цитата Сообщение от ForEveR Посмотреть сообщение
White Luna, Нужна перегрузка - для Vector-а
но а ведь переменная класса KOMPLEX!

Добавлено через 1 минуту
и как перегрузить?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2010, 00:09     Вывод из класса наследника
Еще ссылки по теме:

Создание базового класса и наследника C++
C++ Вызов членов и объектов с наследника класса
C++ Вызвать метод базового класса из метода наследника
Два конструктора для класса-наследника C++
Вывод переменной из наследника класса C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7955 / 4717 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
12.11.2010, 00:09     Вывод из класса наследника #14
White Luna, Обе переменные и t и h у вас класса Vector. А как перегрузить это вы уж думайте сами... Форматировать код хотя бы научитесь...
Yandex
Объявления
12.11.2010, 00:09     Вывод из класса наследника
Ответ Создать тему
Опции темы

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