Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 121

Нахождение ошибки в наследовании и приведении типов

04.06.2016, 23:52. Показов 613. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
имеется рабочий код на с++, пыталась переделать его в С#, возникают ошибки,которые я не в состоянии сама исправить. Буду безумно признательна, если кто - то попробует мне помочь
прилагаю код на с++ и мою попытку на С#
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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
using System.Runtime.InteropServices;
 
namespace ComplexNumbers
{
    class Program
    {
 
        static void Main(string[] args)
        {
             
            Complex a = new Complex(200,10);
            Complex b = new Complex(4, 5);
            Complex g = a - b;
            Console.WriteLine("a =" + "(" + a.re + "," + a.im + ")");
            Console.WriteLine("b =" + "(" + b.re + "," + b.im + ")");
            Console.WriteLine("-------------------------------------");
            Console.WriteLine("c="+"("+g.re.ToString() + "," + g.im.ToString()+")");
            Complex v = a + b;
            Console.WriteLine( "c=" +"(" + v.re.ToString() + "," + v.im.ToString() + ")");
           //
            Complex d = a * b;
            Console.WriteLine("c=" + "(" + d.re.ToString() + "," + d.im.ToString() + ")");
         Complex c = a / b;
            Console.WriteLine("c=" + "(" + c.re.ToString() + "," + c.im.ToString() + ")");
           
            
            
//1!  ////**********полиморизм.один указатель на базовый класс указывает на объекты базового 
            //и производного класса и вызывают виртуальный метод
 
 
            Complex *pComplex;//указ на баз.клас и произ
 
Vector x=new Vector(7, 8);
        Console.WriteLine("d =" + "(" + d.re + "," + d.im + ")"); 
        Console.WriteLine("x =" + "(" + x.re + "," + x.im + ")");
 pComplex = &x;
 Vector t=x*d;
        Console.WriteLine("c="+"("+t.re.ToString() + "," + t.im.ToString()+")");
pComplex ->Show();//вызов вирт.метода
           
            Console.WriteLine("vector d "); 
 
pComplex = &d;
pComplex ->Show();
 
            Console.WriteLine("vector b*x ");   
 (b*x).Show();
             Console.WriteLine("vector e+x"); 
 (b+x).Show(); 
 ////
            Console.ReadKey(true);
 
        }
 
 
 
        //класс комплекс
       public  class Complex
        {
           private float _re;
           private float _im;
 
 
 
            public float re
            {
                get { return _re; }
                private set { _re = value; }
            }
 
            public float im
            {
                get { return _im; }
                private set { _im = value; }
            }
 
            public Complex(float r, float m)
            {
                re = r;
                im = m;
            }
 
            public Complex() //конструктор без параметров
            {
                re = im = 0;
            }
 
            public static Complex operator +(Complex C1, Complex C2) 
            {
                return new Complex(C1.re + C2.re, C1.im + C2.im);
            }
            public static Complex operator -(Complex C1, Complex C2)
            {
                return new Complex(C1.re - C2.re, C1.im - C2.im);
            }
            ///
            public static Complex operator *(Complex C1, Complex C2) 
            {
                Complex C = new Complex();
                C.re = (C1.re * C2.re - C1.im * C2.im);
                C.im = (C2.re * C1.im + C1.re * C2.im);
                return C;
            }
            public static Complex operator /(Complex C1, Complex C2)
            {
                Complex C = new Complex();
                C.re = (C1.re * C2.re + C1.im * C2.im) / (C2.re * C2.re + C2.im * C2.im);
                C.im = (C2.re * C1.im - C2.im * C1.re) / (C2.re * C2.re + C2.im * C2.im);
                return C;
            }
          
           
 float priv (float re) 
 
 { 
 return re; 
 } 
 float mnim (float im) 
 { 
 return im; 
 }
        }
      
 
        //класс вектор, наследование
 
 
       public  class Vector: Complex
        {
          private float _re;
           private float _im;
 
            public float re
            {
                get { return _re; }
                private set { _re = value; }
            }
 
            public float im
            {
                get { return _im; }
                private set { _im = value; }
            }
 
             public Vector(float r, float m)
            {
                re = r;
                im = m;
            }
              public Vector ()
            {
                re = im = 0;
            }
        
        
        
//2!  //----приведение типов-----//
             public static Vector& operator *(Complex C1, Complex C2) 
            {
               Vector C3 = new Vector();
            Complex C = new Complex();
            C.re=C3.priv(re);
             Complex.im=C3.mnin(im);
           return Vector(re,im); 
        }
 
 
       }
 
    }
}
и вдруг понадобиться на с++ код
Кликните здесь для просмотра всего текста
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
151
152
153
154
155
156
157
158
159
160
161
class Complex 
{protected:
float Re, Im; //private
 
public: 
 
    Complex(float R,float M) //конструкторы с параметрами
 { 
 //Re = Im = 0; 
 Re=R;
 Im=M;
 } 
 
  Complex(void) //конструктор без параметров
 { 
 Re = Im = 0; 
 } 
Complex& operator - (Complex&C2);
Complex& operator *(Complex C2); //объявляем в классе
Complex& operator /(Complex C2);
 
 
 
virtual void Show() //метод для отображения переменной на экране Complex *pComplex;
 { 
 if (Im > 0) 
 printf("(%.2f%;%.2f%)\n", Re, Im); 
 else printf("(%.2f%;%.2f%)\n", Re, Im); 
 } 
 Complex  operator + (Complex C2) //а здесь в классе  Complex -оператор
 { 
 Complex C; 
C.Re = Re + C2.Re; 
C.Im = Im + C2.Im; 
 return C; 
 } 
 float priv (float Re) 
 { 
 return Re; 
 }; 
 float mnim (float Im) 
 { 
 return Im; 
 }
}; 
//закрывается класс
 
class Vector:public Complex
 
{
 
    
public:
     Vector (float re, float im)
     {
         Re=re; Im=im;
        
     }
    virtual  void Show()
 
    {printf("(%.2f%;%.2f%)\n",Re, Im); }
    
/*Vector& Complex& Complex:: operator *(Complex&C2)*/ 
 
     
     
     Vector& operator *(float c)
{
    Vector tmp(0,0);
    tmp.Re=Re*c;//для которого вызван метод перед *
    tmp.Im=Im*c;
 
return tmp;
}
    
     Vector& operator=(Complex c) 
 { 
 Re=c.priv(Re); 
 Im=c.mnim(Im); 
 return Vector(Re,Im); 
 }
};
 
//------------------
 
 
Complex& Complex::operator - (Complex&C2) 
 { 
 Complex C; 
C.Re = Re - C2.Re; 
C.Im = Im - C2.Im; 
 return C; 
 } 
 
 Complex& Complex::operator *(Complex C2) // Complex:: означает,что оператор относиться к классу
{Complex C;
C.Re=(Re*C2.Re-Im*C2.Im);
C.Im=(C2.Re*Im+Re*C2.Im);
return C;
}
 
Complex& Complex::operator /(Complex C2)
{
Complex C;
C.Re=(Re*C2.Re+Im*C2.Im)/(C2.Re*C2.Re+C2.Im*C2.Im);
C.Im=(C2.Re*Im-C2.Im*Re)/(C2.Re*C2.Re+C2.Im*C2.Im);
return C;
}
 
int main() 
 {
     Complex a(7,8); 
     
 
 printf("object a "); 
 a.Show(); 
 //Complex C; 
 //C.Show();
 Complex b(10,10); 
 printf("object b "); 
 b.Show(); 
 Complex c = a.operator +(b); 
 printf("a+b "); 
 c.Show(); 
 //c=a+b;//вызов в операторном вмде
  //c.Show();
 c = a.operator - (b); //
  c=a-b;
 printf("a-b "); 
 c.Show(); 
 c=a*b;
  printf("a*b ");
  c.Show();
  
  c=a/b;
   printf("a/b ");
  c.Show(); 
  //-----------------
 
  //////////
 
 
  Complex *pComplex;//указ на баз.клас и произ
//Complex e(10, 10);
Vector d(7, 8);
 printf("vector b ");  
pComplex = &b;
pComplex ->Show();//вызов вирт.метода
  printf("vector d "); 
pComplex = &d;
pComplex ->Show();
 
//////////
 printf("vector b*d ");   
 (b*d).Show();
printf("vector e+d"); 
 (b+d).Show(); 
 ////
 _getch(); 
 return 0; 
 };
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.06.2016, 23:52
Ответы с готовыми решениями:

О приведении типов и классов
Читая про приведение типов из msdn наткнулся на фразу Этого я, признаюсь, не понял. Производные классы имеют все те же поля и методы,...

Ошибка в приведении типов
Здравствуйте. Я недавно начал самостоятельно изучать программирование Win32 приложений, и у меня стабильно возникает похожая ошибка:...

Ну жна помощь в приведении типов
Никак не могу понять как работает приведение типов. В первую очередь про dynamic_cast. Допустим у нас есть такая часть программы ...

4
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
05.06.2016, 09:33
Цитата Сообщение от sodaily Посмотреть сообщение
имеется рабочий код на с++, пыталась переделать его в С#
Прямолинейный перевод с одного языка на другой - плохая затея. Каждый язык имеет свои особенности, возможности, традиции. Если бы они были эквивалентны, то не было бы смысла создавать разные языки. Поэтому код нужно не переводить, а переписывать.

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
using System;
 
namespace ConsoleApplication212
{
    class Program
    {
        static void Main(string[] args)
        {
            var a = new Complex(200, 10);
            var b = new Complex(4, 5);
            Console.WriteLine("a = {0}", a);
            Console.WriteLine("b = {0}", b);
 
            Console.WriteLine("-------------------------------------");
 
            var c = a + b;
            Console.WriteLine("a + b = {0}", c);
            c = a - b;
            Console.WriteLine("a - b = {0}", c);
            c = a * b;
            Console.WriteLine("a * b = {0}", c);
            c = a / b;
            Console.WriteLine("a / b = {0}", c);
 
            Console.WriteLine("-------------------------------------");
 
            //создание Vector
            var v = new Vector(10, 10);
            var w = new Vector(15, 3);
            Console.WriteLine("v = {0}", v);//здесь полиморфизм - вызывается метод ToString из Vector
            Console.WriteLine("w = {0}", w);//здесь полиморфизм - вызывается метод ToString из Vector
 
            //сложение векторов (использование операторов, унаследованных от Complex)
            var r = new Vector(v + w);
            Console.WriteLine("v + w = {0}", r);//здесь полиморфизм - вызывается метод ToString из Vector
 
            Console.ReadLine();
        }
    }
 
    /// <summary>
    /// Комплексное число
    /// </summary>
    public class Complex
    {
        public float Re {get; protected set; }
        public float Im { get; protected set; }
 
        public Complex(float real, float im)
        {
            Re = real;
            Im = im;
        }
 
        public Complex()
        {
        }
 
        public static Complex operator +(Complex c1, Complex c2)
        {
            return new Complex(c1.Re + c2.Re, c1.Im + c2.Im);
        }
 
        public static Complex operator -(Complex c1, Complex c2)
        {
            return new Complex(c1.Re - c2.Re, c1.Im - c2.Im);
        }
 
        public static Complex operator *(Complex c1, Complex c2)
        {
            var res = new Complex();
            res.Re = (c1.Re*c2.Re - c1.Im*c2.Im);
            res.Im = (c2.Re*c1.Im + c1.Re*c2.Im);
            return res;
        }
 
        public static Complex operator /(Complex c1, Complex c2)
        {
            var res = new Complex();
            res.Re = (c1.Re*c2.Re + c1.Im*c2.Im)/(c2.Re*c2.Re + c2.Im*c2.Im);
            res.Im = (c2.Re*c1.Im - c2.Im*c1.Re)/(c2.Re*c2.Re + c2.Im*c2.Im);
            return res;
        }
 
        public override string ToString()
        {
            return string.Format("{0} + i{1}", Re, Im);
        }
    }
 
    /// <summary>
    /// Вектор 2D
    /// </summary>
    public class Vector : Complex
    {
        public float X { get { return Re; } }
        public float Y { get { return Im; } }
 
        public Vector(float x, float y) : base(x, y)
        {   
        }
 
        public Vector()
        {
        }
 
        //преобразование Complex в Vector
        public Vector(Complex c) : base(c.Re, c.Im)
        {
        }
 
        public override string ToString()
        {
            return string.Format("x={0}; y={1}", X, Y);
        }
    }
}
0
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 121
05.06.2016, 18:52  [ТС]
Storm23,
Цитата Сообщение от Storm23 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
public Vector(float x, float y) : base(x, y)
{
}
public Vector()
{
}
//преобразование Complex в Vector
public Vector(Complex c) : base(c.Re, c.Im)
{
}
почему методы эти пустые?
и если сделать вот так, то где будет полиморфизм
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//создание Vector
            var p = new Vector(10, 10);
            var w = new Vector(15, 3);
            ////////
 
            Console.WriteLine("вектор p =" + "(" + p.Re + "," + p.Im + ")");
        
            Console.WriteLine("вектор w =" + "(" + w.Re + "," + w.Im + ")");
          
            var r = new Vector(p + w);
         
            Console.WriteLine("сумма r =" + "(" + r.Re + "," + r.Im + ")");
            Console.ReadLine();
        }
    }
все тоже самое только без
Цитата Сообщение от Storm23 Посмотреть сообщение
C#
1
2
3
4
public override string ToString()
{
    return string.Format("x={0}; y={1}", X, Y);
}
, этот метод я описала отдельно выше
0
112 / 83 / 32
Регистрация: 10.08.2014
Сообщений: 420
05.06.2016, 21:45
Это не совсем методы. Это конструкторы. Один из них (с base()) вызывает базовый конструктор комплексного числа... Пустые конструкторы я сам точно не знаю для чего - был бы тоже благодарен, если бы пояснили, насколько ошибочно их не использовать. Но, как мне представляется пустые конструкторы создаются чтобы можно было продолжать использовать конструктор по умолчанию и инициализировать затем свойства объекта.

...Полиморфизма в том, что Вы написали в последнем посте я не увидел. Если Вам хочется так писать - Ваше право. Но обычно стараются по максимуму использовать ООП (т.е. и полиморфизм) и переопределяют ToString() для вывода представления объекта (того класса, где метод переопределяется). Кстати, Вы можете изменить ToString() по своему усмотрению, чтобы он выводил то, что Вам хочется.
1
0 / 0 / 0
Регистрация: 02.11.2014
Сообщений: 121
06.06.2016, 00:06  [ТС]
baliar, спасибо)придется снова все возвращать как было раньше, никак не разберусь с этим полиморфизмом
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.06.2016, 00:06
Помогаю со студенческими работами здесь

Создание COM DLL: ошибка в приведении типов
Здорова! Читаю про COM, в книге нашел пример Пример EX24B - обычная MFC DLL, содержащая настоящую COM-версию класса CSpaceship. ...

Изменение значения при приведении типов
Привет форумчане! Вот часть программы: u = 64000; s = (short) u; console.Writeline(&quot;s после присвоения 64000: &quot; + u +...

Почему выдает ошибку о приведении типов?
{$reference System.Windows.Forms.dll} {$reference System.Drawing.dll} uses System.Windows.Forms; type Form =...

FormatException не обработано при приведении типов
Надоело, просто жесть как надоело: err = Convert.ToInt32(hgg); ferrors = err; Ну что здесь не правильно? Студия...

Куда деваются байты при приведении типов?
Всем доброго времени суток... Т.к. основной проект на c++, то пишу сюда... Непонятки с приведением типов, объясните пожалуйста... ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru