Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
1

Перегрузка оператора +

17.06.2014, 20:55. Показов 1229. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот заголовочный файл

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
// Заголовочный файл Vector.h
#ifndef VECTOR_H
#define VECTOR_H
 
#include <iostream>
using namespace std;
 
template<typename T>
class Vector
{
public:
//======================================================================================================
    // Конструктор класса, который инициализирует трехмерный вектор
    Vector(T x, T y, T z) 
    {
        const int ArraySize = 3;     
        Array = new T[ArraySize];
 
        Array[0] = x; 
        Array[1] = y;
        Array[2] = z;
 
        
        XCoord = x;
        YCoord = y;
        ZCoord = z;
    }
//======================================================================================================
    ~Vector()
    {
        delete [] Array;
    }
//======================================================================================================
    // Метод класса, который находит длину вектора
    T GetLength()
    {
        return sqrt(GetVectorXCoordinate() * GetVectorXCoordinate() 
            + GetVectorYCoordinate() * GetVectorYCoordinate() 
            + GetVectorZCoordinate() * GetVectorZCoordinate());
    }
//======================================================================================================
    // Метод класса, который делает вектор единичной длины
    void Normalize()
    {
        T NormX = GetVectorXCoordinate() / GetLength();
        T NormY = GetVectorYCoordinate() / GetLength();
        T NormZ = GetVectorZCoordinate() / GetLength();
 
        XCoord = NormX;
        YCoord = NormY;
        ZCoord = NormZ;
    }
//======================================================================================================    
    T operator+(const Vector<T> vect1, const Vector<T> vect2)
    {
        Vector<T> vect(0, 0, 0);
        T AddX = vect1.GetVectorXCoordinate() + vect2.GetVectorXCoordinate();
        T AddY = vect1.GetVectorYCoordinate() + vect2.GetVectorYCoordinate();
        T AddZ = vect1.GetVectorZCoordinate() + vect2.GetVectorZCoordinate();
 
        return vect(AddX, AddY, AddZ);
    }
//======================================================================================================
private:
    T* Array; 
    T XCoord, YCoord, ZCoord; 
//======================================================================================================
    // Возвращает Х-координату текущего вектора
    T GetVectorXCoordinate()
    {
        return XCoord;
    }
//======================================================================================================
    // Возвращает Y-координату текущего вектора
    T GetVectorYCoordinate()
    {
        return YCoord;
    }
//======================================================================================================
    // Возвращает Z-координату текущего вектора
    T GetVectorZCoordinate()
    {
        return ZCoord;
    }
//======================================================================================================
};
 
#endif
Вот MAIN

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <conio.h>
#include "Vector.h"
using namespace std;
int main()
{
    Vector<double> vect(45, 2, 9), vect1(5, 98, 3), vect2(4, 52, 10);
    std::cout << vect.GetLength() << " " << vect1.GetLength() << " " << vect2.GetLength() << endl << endl;
 
    vect.Normalize();
    vect1.Normalize();
    vect2.Normalize();
 
    std::cout << vect.GetLength() << " " << vect1.GetLength() << " " << vect2.GetLength();
    _getch();
    return 0;
}
Что не так в перегруженном операторе +?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.06.2014, 20:55
Ответы с готовыми решениями:

Перегрузка оператора []
Всем привет! Как можно перегрузить оператор так, чтобы к нему можно было обращаться так:...

Перегрузка оператора ==
нужно сравнить 1) объект класса abc с объектом класса abc1 2) объект класса abc с другим...

Перегрузка оператора +
String String::operator + (String &amp; sg2) { String tmp; tmp.str = new char ; strcpy (tmp.str,...

Перегрузка оператора []
Здравствуйте. Пробую перегрузить оператор . template &lt;class Element&gt; class List { public:...

29
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:01 2
C++
1
Vector operator + (const Vector<T> vect1)
Возвращать this + vect1
0
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:07  [ТС] 3
Не совсем понятно. Только с шаблонами начал работать.
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:17 4
Шаблон тут не причём. Возвращать нужно сам класс, а внутри сложение выполняешь между данным объектом (this) и переданным
C++
1
2
3
4
Vector<T> vect(GetVectorXCoordinate() + vect1.GetVectorXCoordinate(),
    GetVectorYCoordinate() + vect1.GetVectorYCoordinate(),
    GetVectorZCoordinate() + vect1.GetVectorZCoordinate());
    return vect;
0
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:25 5
Цитата Сообщение от nocl1p Посмотреть сообщение
Не совсем понятно.
Оператор объявлен членом класса, у него уже есть неявный первый параметр this. Два явных параметра нужны оператору, объявленному вне класса.
0
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:27  [ТС] 6
Вот так исправил

C++
1
2
3
4
5
6
7
8
Vector operator + (Vector<T>& vect1)
    {
        Vector<T> vect(GetVectorXCoordinate() + vect1.GetVectorXCoordinate(),
            GetVectorYCoordinate() + vect1.GetVectorYCoordinate(),
            GetVectorZCoordinate() + vect1.GetVectorZCoordinate());
 
        return vect;
    }
При компиляции печаль((

Перегрузка оператора +
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:29 7
Это из-за сложения? У тебя же оно нигде не применяется в main().
0
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:32  [ТС] 8
Не не. в мейне я написал

C++
1
2
3
vect2 = vect + vect1;
 
    std::cout << vect2.GetLength();
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:36 9
А почему у тебя всего 3 параметра в конструкторе? Должно же быть 6. Либо два набора координат, либо координаты и проекции.
0
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:37  [ТС] 10
Координаты вектора в трехмерном пространстве. Этого разве не достаточно?
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:39 11
У тебя координаты точки в трёхмерном пространстве передаются в конструктор, хотя в классе 6 параметров предусмотрено.
1
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:39 12
Цитата Сообщение от nocl1p Посмотреть сообщение
Не не. в мейне я написал
А где конструктор копирования или оператор присвоения?
У тебя в классе есть указатель, при присвоении он копируется.
1
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:42  [ТС] 13
В моем классе 6 параметров????????????????????????????????????

Добавлено через 53 секунды
Присваивание проходит путем инициализации класса vect(6, 7, 8)
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:45 14
Три ты динамически (зачем-то) создаёшь, ещё три просто объявлены.
Математику почитай, вектор либо координатами концов задаётся, либо начало + проекции.
1
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:49 15
Цитата Сообщение от nocl1p Посмотреть сообщение
Присваивание проходит путем инициализации класса vect(6, 7, 8)
C++
1
vect2 = vect + vect1;
Вот тут результатом оператора сложения будет объект на стеке, который копируется в vect2. Не?
1
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:51  [ТС] 16
На счет динамического массива согласен. Не прав. Тогда как правильно объявить конструктор?
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:53 17
В твоём случае не только в стеке. Он же ещё себе память динамически выделит на три элемента, а в стеке будет указатель.

Добавлено через 1 минуту
Может надо с T, тут я точно не уверен:
C++
1
Vector<T> operator + (const Vector<T>& vect1)
1
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:54  [ТС] 18
Я кстати думал насчет динамического массива. Может он просто не нужен там??
0
7790 / 6557 / 2984
Регистрация: 14.04.2014
Сообщений: 28,666
17.06.2014, 21:56 19
Ну учитывая, что количество параметров одинаково - проще объявить все в классе.
1
55 / 38 / 20
Регистрация: 30.03.2012
Сообщений: 330
17.06.2014, 21:57  [ТС] 20
В паблике как X, Y, Z?
0
17.06.2014, 21:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2014, 21:57
Помогаю со студенческими работами здесь

Перегрузка оператора
Доброго времени суток. Столкнулся с проблемой перегрузки оператора &quot;++&quot; выдает ошибку в первой...

Перегрузка оператора +
Добрый день, товарищи программиста. Вопрос такой. Я перезагружаю оператор + на языку с++, и...

Перегрузка оператора ()
кто может подсказать как создать перегрузку что бы можно было работать с амссивввом в таком ввиде...

Перегрузка оператора -=
Добрый день, товарищи программиста. Вопрос такой. у перезагружаю оператор -= на языку с++, и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru