Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 25.06.2013
Сообщений: 8
1

Перегрузка оператора "+" в шаблонах (классы)

15.11.2015, 09:00. Показов 708. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Суть проблемы такова: написан класс, написан шаблон, работает всё хорошо, выполняет операции с типами данных int, float, double..., compnum(да-да, с комплексными числами тоже работает), НО... Не моогу сделать так, чтобы корректно работал с char... То есть, по сути, мне надо сделать так:
Размерность - 3,
Вектор А = {a, b, c}
Вектор В = (d, e, f}
Сумма = {ad, be, cf}
Разность в реализации не нужна, в общем-то, а вот реализация char очень важна, нужна ваша помощь... Заранее огромное спасибо! Код прикреплён ниже. У меня два файла в проекте: Source.cpp и compnum.cpp.

Source.cpp:
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
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include "locale.h"
#include "compnum.cpp"
#pragma warning(disable : 4996)
 
using namespace std;
 
template <class t>
class vect
{
private:
    int n;
    t *v;
public:
    void SetElements();
    void GetElements();
    vect operator +(vect<t> &V); //сумма векторов
    vect operator -(vect<t> &V); //разность векторов
    vect(int k = 2) { v = new t[n = k]; }//конструктор по умолчанию с параметрами
    vect(vect<t> &B) { n = B.n; v=new t[n]; for (int i = 0; i < n; i++) v[i] = B.v[i]; }; //конструктор копирования
    vect operator =(vect<t> &B); //конструктор присваивания
    ~vect() { n = NULL; delete[]v; }; //деструктор
};
 
template <class t>
void vect<t>::SetElements()
{
    for (int i = 0; i < n; i++)
        cin >> v[i];
}
 
template <class t>
void vect<t>::GetElements()
{
    cout << "{";
    for (int i = 0; i < n - 1; i++)
        cout << v[i] << ", ";
    cout << v[n - 1] << "}";
}
 
template <class t>
vect<t> vect<t>::operator +(vect &V)
{
    vect temp(n);
 
    for(int i = 0; i < n; i++)
        temp.v[i] = v[i] + V.v[i];
 
    return temp;
}
 
template <class t>
vect<t> vect<t>::operator -(vect &V)
{
    vect temp(n);
 
    for(int i = 0; i < n; i++)
        temp.v[i] = v[i] - V.v[i];
 
    return temp;
}
 
template <class t>
vect<t> vect<t>::operator =(vect &B)
{
    if ((this->n == B.n) && (this->v == B.v))
        return *this;
    delete[]v;
    n = B.n;
    v = new t[n];
    for (int i = 0; i < n; i++)
        v[i] = B.v[i];
 
    return *this;
}
 
int main()
{
    int k;
 
    setlocale(LC_ALL, "Russian");
    cout << "Введите размерность векторов: ";
    cin >> k;
 
    vect<char> A(k), B(k), C(k);
 
    cout << "Ввод координат первого вектора: ";
    A.SetElements();
    cout << "Вектор A ";
    A.GetElements();
    cout << "\n";
    cout << "Ввод координат второго вектора: ";
    B.SetElements();
    cout << "Вектор B ";
    B.GetElements();
    cout << "\n\n";
    C = A + B;
    cout << "Сумма векторов = S ";
    C.GetElements();
    cout << "\n";
    C = A - B;
    cout << "Разность векторов = D ";
    C.GetElements();
    cout << "\n";
}
compnum.cpp:
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
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
#include "locale.h"
#include <math.h>
 
using namespace std;
 
class CompNum
{
private:
    float Re, Im;
public:
    friend istream& operator >> (istream&, CompNum&);//переопределение дружественной к компл. числам операции cin (ввод)
    friend ostream& operator << (ostream&, const CompNum&);//переопределение дружественной к компл. числам операции cout (вывод)
    CompNum operator +(CompNum &B);
    CompNum operator -(CompNum &B);
    CompNum operator *(CompNum &B);
    CompNum(float a = 0, float b = 0) { Re = a; Im = b; } //конструктор по умолчанию с параметрами
    CompNum(CompNum &B) { Re = B.Re; Im = B.Im; }; //конструктор копирования
    CompNum operator =(CompNum &B); //конструктор присваивания
    ~CompNum() { Re = NULL; Im = NULL; } //деструктор
};
 
CompNum CompNum::operator +(CompNum &B)
{
    CompNum temp;
    temp.Re = Re + B.Re;
    temp.Im = Im + B.Im;
    return temp;
}
 
CompNum CompNum::operator -(CompNum &B)
{
    CompNum temp;
    temp.Re = Re - B.Re;
    temp.Im = Im - B.Im;
    return temp;
}
 
CompNum CompNum::operator *(CompNum &B)
{
    CompNum temp;
    temp.Re = Re*B.Re - Im*B.Im;
    temp.Im = Re*B.Im + Im*B.Re;
    return temp;
}
 
CompNum CompNum::operator =(CompNum &B)
{
    Re = B.Re;
    Im = B.Im;
    return *this;
}
 
istream& operator >> (istream &cin, CompNum &c)
{
    cin >> c.Re >> c.Im;
    return cin;
}
 
ostream& operator << (ostream &cout, const CompNum &c)
{
    if (c.Re == 0)
        printf("%.2fi", c.Im);
    else
    {
        if (c.Im > 0)
            printf("%.2f+%.2fi", c.Re, c.Im);
        if (c.Im < 0)
            printf("%.2f%.2fi", c.Re, c.Im);
        if (c.Im == 0)
            printf("%.2f", c.Re);
    }
    return cout;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.11.2015, 09:00
Ответы с готовыми решениями:

Классы, перегрузка оператора вывода
Здравствуйте, встретился мне на просторах интернета следующий код: Перегрузка оператора вывода &lt;&lt;: ostream&amp;...

Классы, комплексные числа и перегрузка оператора
Составить описание класса для представления комплексных чисел. Обеспечить вы- полнение операций сложения, вычитания и умножения...

Перегрузка оператора + для сложения матриц (С++, ООП, Классы, WinForms)
Помогите пожалуйста с проблемой. Не правильно работает перегрузка операции + для сложения двух матриц. код Matritsa.h #pragma once ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.11.2015, 09:00
Помогаю со студенческими работами здесь

Использование свойства полиморфизма (перегрузка метода и перегрузка оператора)
Написать функцию, которая вычисляет значение а*b. Числа а и b могут быть любыми дробными положительными числами.

Сделать реализацию list (классы node и list) на шаблонах
Помогите написать прогу Необходимо: Сделать реализацию list (классы node и list) на шаблонах. 1.push_back 2.push_front 3.size ...

Перегрузка оператора ++
Есть класс ThreeD и метод перегрузки ++: public static ThreeD operator ++(ThreeD op) { ThreeD result = new ThreeD(); ...

Перегрузка оператора ->
скажите, а какие особенности перегрузки -&gt; ?

Перегрузка оператора new[]
Привет всем, программирую давольно давно, на с++ второй год. Столкнулся с задачей, в которой нужно создать свой класс и корректно в нем...


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

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

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Что нового в C# 14
UnmanagedCoder 10.03.2025
Предстоящая версия C# 14 обещает принести изменения, которые сделают разработку еще более приятной и эффективной. Что стоит отметить, так это влияние сообщества разработчиков на формирование новых. . .
Формулы поворота
Igor3D 10.03.2025
Добрый день Тема Эти формулы приводятся во множестве тьюториалов, часто под видом "матрица вращения на плоскости". x' = x * cos(a) - y * sin(a) y' = y * cos(a) + x * sin(a) Как бы Вы их. . .
Что нового в .NET 10
UnmanagedCoder 10.03.2025
. NET 10 выходит как релиз с длительной поддержкой (LTS), включающей три года обновлений. В этом обновлении Microsoft сфокусировались на нескольких направлениях: производительность, оптимизация. . .
Отложенное высвобождение, RCU и Hazard Pointer в C++26
NullReferenced 09.03.2025
Многопоточное программирование стало важной частью современной разработки. Когда несколько потоков одновременно работают с общими данными, возникает целый ряд проблем, связанных с синхронизацией и. . .
Неблокирующийся стек на C++26
NullReferenced 09.03.2025
Традиционные способы синхронизации в многопоточном программировании — мьютексы, семафоры, условные переменные — часто превращаются в узкое место в плане производительности. При этом неблокирующиеся. . .
Обработка строк в C++26: Новые возможности string и string_view
NullReferenced 09.03.2025
Новый стандарт C++26 предлагает много улучшений для работы с привычными string и относительно новыми string_view. string_view - это невладеющая ссылка на последовательность символов, появившаяся в. . .
Мой первый аддон для Blender 3D, с помощью нейронки (не зная даже азов пайтона, но это не значит что так и с остальным).
Hrethgir 09.03.2025
Потратил весь день. Пол-дня мне хватило, чтобы понять что с версией с 14B мне не одолеть написание функционального кода, на языке с которым я вообще никак не знаком - пайтон. Версия 22B от другого. . .
Einstein@Home сегодня исполняется двадцать лет!
Programma_Boinc 09.03.2025
Einstein@Home сегодня исполняется двадцать лет! Отправлено 19 февраля 2025 года в 17:20:21 UTC Я хочу поздравить всех наших волонтеров, разработчиков и ученых из Einstein@Home. Мы официально. . .
Заполнители и расширенный набор символов в C++26
NullReferenced 09.03.2025
C++26 представляет два важных обновления: заполнители и расширенный набор символов. Заполнители (placeholders) решают давнюю проблему лаконичности кода в шаблонных выражениях и лямбда-функциях. Они. . .
Контракты в C++26
NullReferenced 09.03.2025
Контракты – это механизм, позволяющий указывать предусловия, постусловия и инварианты для функций в коде. Эта функциональность должна была стать частью C++20, но была исключена на встрече комитета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru