С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/32: Рейтинг темы: голосов - 32, средняя оценка - 4.75
 Аватар для Johny be Good
7 / 7 / 3
Регистрация: 25.09.2010
Сообщений: 89

Создание класса-прототипа

30.11.2010, 17:16. Показов 6312. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста! У меня был мой класс для работы с комплексными числами, теперь его надо переделать под класс прототип(чтобы указывался тип переменной в <>). Вроде бы везде поменял переменную но при операции сложения выводит "Оператор "+" не может применяться к операндам типа "T" и "T"
Вот код:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
 
namespace ConsoleApplication21
{
    public class Complex<T>
    {
        public T a, b;
 
        public Complex(T m, T n)
        {
            a = m;
            b = n;
        }
        public Complex<T> Plus(Complex<T> m)
        {
            T u, v;
            u = a +m.a;
            v = b + m.b;
            return (new Complex<T>(u, v));
        }
        public static Complex<T> operator +(Complex<T> c1, Complex<T> c2)
        {
            return (c1.Plus(c2));
        }
       
        public void PrintComplex(string name)
        {
            Console.WriteLine("{0} = {1}+({2}i)", name, a, b);
        }
 
    }
    class Program
    {
        static void Main()
        {
            Complex<int> c1 = new Complex<int>(5, 2);
            Complex<int> c2 = new Complex<int>(3, 4);
            Complex<int> c3;
            c3 = c1 + c2;
            c3.PrintComplex("c3");
            c2.PrintComplex("c2");
            c1.PrintComplex("c1");
            Console.ReadLine();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.11.2010, 17:16
Ответы с готовыми решениями:

Сортировка массива с помощью Класса-прототипа List<>
Приветствую! Товарищи, нужна помощь в написании простенькой программы. Программа должна считывать данные из текстового файла и сортировать...

Создание прототипа фасадного калькулятора
Все привет. Подскажите плз, что еще нужно сделать , чтоб калькулятор заработал? Не могу понять почему на основе выбранных данных не...

Создание прототипа СКУД на ардуино
Всем привет. Ребят нужна ваша помощь. Планирую создать прототип СКУД, где для доступа будут испоьзоваться 3 массива Name, PIN, TAG ...

19
62 / 51 / 15
Регистрация: 08.07.2010
Сообщений: 119
30.11.2010, 17:46
Цитата Сообщение от Johny be Good Посмотреть сообщение
T u, v;
u = a +m.a;
* * * * * * v = b + m.b;
Не факт, что для типа T будет определен оператор сложения

Добавлено через 6 минут
Это поможетhttp://www.codeproject.com/KB/... ators.aspx
0
 Аватар для Johny be Good
7 / 7 / 3
Регистрация: 25.09.2010
Сообщений: 89
30.11.2010, 17:59  [ТС]
Насколько я понял, мне придется создавать еще 1 класс который будет отвечать за все эти действия(т.к.:+,-,*,/) ?
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
01.12.2010, 05:01
Цитата Сообщение от Johny be Good Посмотреть сообщение
Насколько я понял, мне придется создавать еще 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
using Leleko.Net;
 
namespace ConsoleApp
{
    //Первый вариант
    public class Complex<T>
    {
        // Поле будет инициализироваться всего 1 раз для каждого T
        protected static readonly Func<T, T, T> defaultAdditor = Kernel.Math.Delegate.Additor<T>.Default;
 
        public T a, b;
 
        public Complex(T m, T n) { a = m; b = n; }
        public static Complex<T> operator +(Complex<T> c1, Complex<T> c2) 
        {
            return new Complex<T>(defaultAdditor(c1.a, c2.a), defaultAdditor(c1.b, c2.b));
        }
    }
    //Второй вариант
    //Но в этом случае T должно быть примитивным числовым типом(int,double,....)
    public class Complex2<T>
    {
        public T a, b;
 
        public Complex2(T m, T n) { a = m; b = n; }
        public static Complex2<T> operator +(Complex2<T> c1, Complex2<T> c2) 
        {
            return new Complex<T>(Kernel.Math.T.Add(c1.a, c2.a), Kernel.Math.T.Add(c1.b, c2.b));
        }
    }
}
Сборку можно подцепить сдесь:
1
62 / 51 / 15
Регистрация: 08.07.2010
Сообщений: 119
01.12.2010, 09:19
Подход точно такой же, как и в примере на CodeProject...Только здесь придется подключать стороннюю сборку ради одной задачи.
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
01.12.2010, 11:29
Цитата Сообщение от ivanoff80 Посмотреть сообщение
Подход точно такой же, как и в примере на CodeProject...Только здесь придется подключать стороннюю сборку ради одной задачи.
Мой Вариант #2 не требует делегата....
0
62 / 51 / 15
Регистрация: 08.07.2010
Сообщений: 119
01.12.2010, 11:54
С примитивными типами он справляется довольно успешно, в т.ч. double, int. А с string уже выкидывает эксепшн(
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
01.12.2010, 11:59
Цитата Сообщение от ivanoff80 Посмотреть сообщение
С примитивными типами он справляется довольно успешно, в т.ч. double, int. А с string уже выкидывает эксепшн(
Да. Я уже посмотрел.
А string выкидывает исключение потому как s1+s2 на il выглядит не как op_Addition(s1,s2), а как Concat(s1,s2)...
0
62 / 51 / 15
Регистрация: 08.07.2010
Сообщений: 119
01.12.2010, 12:07
Интересно, можно ли вызвать перегруженный оператор +. Он,по идеи, должен быть у всех классов поддерживающих эту операцию
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
01.12.2010, 12:20
Цитата Сообщение от ivanoff80 Посмотреть сообщение
Интересно, можно ли вызвать перегруженный оператор +. Он,по идеи, должен быть у всех классов поддерживающих эту операцию
Ты имеешь ввиду примитивные типы?
0
62 / 51 / 15
Регистрация: 08.07.2010
Сообщений: 119
01.12.2010, 12:33
Перегрузка оператора сложения должна быть у всех типов, или только у не примитивных?
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
01.12.2010, 12:52
Цитата Сообщение от ivanoff80 Посмотреть сообщение
Перегрузка оператора сложения должна быть у всех типов, или только у не примитивных?
Верно. В том и фишка, что у примитивов оператора как такового и нет.
Только il команда - Add или AddOvf

По сути функция
C#
1
2
3
4
5
6
7
8
.method public hidebysig static !!Tp  Add<Tp>(!!Tp x, !!Tp y) cil managed
{
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  add
  IL_0003:  ret
} // end of method T::Add
Подойдет для сложения переменных любого примитивного типа...
А у непримитивных будет что-то типа:
C#
1
2
3
4
5
6
7
8
.method public hidebysig static class Pretender  Add(class Pretender a, class Pretender b) cil managed
{
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldarg.1
  IL_0002:  call       class Pretender Pretender::op_Addition(class Pretender, class Pretender)
  IL_0007:  ret
} // end of method MAIN::Add
Т.е. обратите внимание - во 2м случае происходит вызов статического метода op_Addition
1
62 / 51 / 15
Регистрация: 08.07.2010
Сообщений: 119
01.12.2010, 13:08
Спасибо, за разжевывание!) Очень много оказывается не знаю о простых вещах.
0
 Аватар для Johny be Good
7 / 7 / 3
Регистрация: 25.09.2010
Сообщений: 89
01.12.2010, 19:05  [ТС]
Скачал я эту сборку Kernel, вот только куда ее кидать или куда ее вставить?
0
62 / 51 / 15
Регистрация: 08.07.2010
Сообщений: 119
01.12.2010, 19:18
в Referens добавляешь
1
 Аватар для Johny be Good
7 / 7 / 3
Регистрация: 25.09.2010
Сообщений: 89
01.12.2010, 19:24  [ТС]
а можеш подсказать где эта папка, а то через поиск не находит((
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
01.12.2010, 19:27
Цитата Сообщение от Johny be Good Посмотреть сообщение
Скачал я эту сборку Kernel, вот только куда ее кидать или куда ее вставить?
Progect -> Add Reference -> Выбрать сборку

Добавлено через 1 минуту
Цитата Сообщение от Johny be Good Посмотреть сообщение
а можеш подсказать где эта папка, а то через поиск не находит((

А задать путь сохранения не пробовали?
1
 Аватар для Johny be Good
7 / 7 / 3
Регистрация: 25.09.2010
Сообщений: 89
01.12.2010, 19:50  [ТС]
C:\Users\root\Documents\Visual Studio 2008\Projects и куда дальше кидать или где создавать? Папка проекта есть ConsoleApplication31.

Добавлено через 6 минут
Попробывал задать при сложении задать тип double, исчезла одни ошибка появилась другая(впринципе мне нужна работа только с числами, строки и символы не нужны)
Выдает:"Тип одного из параметров бинарного оператора должен быть вмещающим"

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections;
 
namespace ConsoleApplication21
{
    public class Complex<T>
    {
 
        //a-вещественное, b-мнимое
        public T a, b;
 
        public Complex(T m, T n)
        {
            a = m;
            b = n;
        }
        public Complex<T> Plus(double m)
        {
            double u, v;
            
            u = a + m.a;
            v = b + m.b;
            return (new Complex<T>(u, v));
        }
        public static Complex<T> operator +(double c1, double c2)
        {
            return (c1.Plus(c2));
        }
0
 Аватар для sigmov
585 / 372 / 63
Регистрация: 22.07.2009
Сообщений: 875
Записей в блоге: 4
02.12.2010, 05:11
Цитата Сообщение от Johny be Good Посмотреть сообщение
C:\Users\root\Documents\Visual Studio 2008\Projects и куда дальше кидать или где создавать? Папка проекта есть ConsoleApplication31.
Закинуть сборку Net.Kernel.dll в любое место.
А затем просто присоеденить сборку к проекту через Project->Add Reference->Вкладка Browse->Найти сборку у себя на компе(куда ее закинули) и нажать Ок. Все!
C#
1
public static Complex<T> operator +(double c1, double c2) { return (c1.Plus(c2)); }
Один из параметров оператора должен быть собственным типом(Complex<T>).
0
 Аватар для Johny be Good
7 / 7 / 3
Регистрация: 25.09.2010
Сообщений: 89
02.12.2010, 15:32  [ТС]
Всем спасибо разобрался)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.12.2010, 15:32
Помогаю со студенческими работами здесь

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); Вопрос: BC - это экземпляр класса BaseClass...

Создание своего класса кнопки с использованием наследования от класса UserControl
Ребят, помогите, такая проблема: создаю класс MyButton в C# при помощи наследования от класса UserControl и в классе MyButton переопределяю...

Явное создание экземпляра класса и явная специализация шаблона класса
Всем добрый день! Не могу разобраться - эти две технологии дают один и тот же результат? В каких случаях применять одно и другое?...

Создание тестового класса (метода) для готового класса в Java
Может я чего-то не понимаю. Так вот.Припустим я создал готовый класс в Java,который выполняет какие-то действия.но его нужно...

Создание экземпляра класса, имя класса находиться в строковой переменной
Подскажите люди добрые, как можно выйти из такой ситуации, вот допустим имеются классы class new1{ . . . } class new2{ . . ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru