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

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

Войти
Регистрация
Восстановить пароль
 
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
#1

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

11.11.2010, 15:22. Просмотров 837. Ответов 13
Метки нет (Все метки)

У меня получается вывод из главного класса, а когда вывожу через функцию из класса наследника выдает ошибку, из-за чего так???? хоты вывожу по тому же принципу как и из главного класса
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
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2010, 15:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывод из класса наследника (C++):

Вывод переменной из наследника класса - C++
Здравствуйте. Как можно вывести значение переменной класса из наследника, изменив это значение в нём? Таким методом, как я пробую, значение...

Правда, что указатель класса-наследника не может указывать на объект класса-родителя? - C++
Доброго времени суток! Пример кода ниже. Правда ли , что указатель класса-наследника не может указывать на объект класса-родителя? ...

Вызов конструктора базового класса из класса-наследника - C++
Можно ли вне списка инициализации вызвать конструктор базового класса ? class A { int a; public: A(int c):a(c){} ...

Конструктор класса наследника - C++
Я не могу понять свою ошибку к примеру если пишу так все нормально class one { public: one(); };

Создание базового класса и наследника - C++
в данной программе , попросили добавить в void main ///camera obj//// и дописать в конструктор camera::camera() сразу вывод через...

Объявление наследника шаблонного класса - C++
как объявить наследника шаблонного класса, да ещё если он обрамлён собственным пространсвом имён? Вот мой класс: namespace my_complex { ...

13
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) {};
    
    //Здесь реализовываешь доп функционал
                           
};
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
11.11.2010, 22:16  [ТС] #3
все равно та же ошибка выдается, даж есл исправить как ты сказал

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

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

C++
1
Vector (t-h).vivod2();
C++
1
(t-h).vivod2
тогда уж. Но я бы посоветовал записать в отдельную переменную...
0
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
тогда уж. Но я бы посоветовал записать в отдельную переменную...
я не считаю, что это норм, просто учительница (практику ведет у нас ток с прибабахом) сказала так попробовать,
как отдельную переменную мож пояснить, я тебя не поняла что ты под этим подразумеваешь
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
11.11.2010, 23:39 #6
White Luna, VECTOR s=t-h;
1
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
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.11.2010, 00:01 #8
C++
1
2
3
                case 2:
                                        (a+f).znak();
                                        (t-h).vivod2();
Елки палки, а где перегрузка для минуса для вектора???
Именно для вектора. Ибо перегрузка для KOMPLEX возвращает объект типа KOMPLEX, а вам нужен Vector
0
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 строчки добавила
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.11.2010, 00:03 #10
White Luna, Нужна перегрузка - для Vector-а
0
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;
}
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.11.2010, 00:04 #12
White Luna, Да нет тут перегрузки - для вектора. Только для комплекс.
0
White Luna
32 / 26 / 2
Регистрация: 08.09.2010
Сообщений: 402
12.11.2010, 00:06  [ТС] #13
Цитата Сообщение от ForEveR Посмотреть сообщение
White Luna, Нужна перегрузка - для Vector-а
но а ведь переменная класса KOMPLEX!

Добавлено через 1 минуту
и как перегрузить?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
12.11.2010, 00:09 #14
White Luna, Обе переменные и t и h у вас класса Vector. А как перегрузить это вы уж думайте сами... Форматировать код хотя бы научитесь...
0
12.11.2010, 00:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2010, 00:09
Привет! Вот еще темы с ответами:

Не работает конструктор наследника класса - C++
Есть класс: template &lt;class T&gt; class HashTable { HashTable(int _size) { size = _size; for (int i = 0; i &lt;...

Вызов членов и объектов с наследника класса - C++
Есть базовый класс и два наследника: class CBase { public: int iNum; virtual void CBase_init( ); };

Два конструктора для класса-наследника - C++
Класс B является наследником класса A. Для класса B нужно определить 2 конструктора: один - наследуется от конструктора класса А, второй...

Создание экземпляра для наследника абстрактного класса - C++
Есть абстрактный базовый класс: class Base { public: int variable; virtual void clearVirtualFunction() = 0; }; ...


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

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

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