Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
#1

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

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

Вот заголовочный файл

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;
}
Что не так в перегруженном операторе +?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
17.06.2014, 21:01     Перегрузка оператора + #2
C++
1
Vector operator + (const Vector<T> vect1)
Возвращать this + vect1
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:07  [ТС]     Перегрузка оператора + #3
Не совсем понятно. Только с шаблонами начал работать.
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
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;
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:25     Перегрузка оператора + #5
Цитата Сообщение от nocl1p Посмотреть сообщение
Не совсем понятно.
Оператор объявлен членом класса, у него уже есть неявный первый параметр this. Два явных параметра нужны оператору, объявленному вне класса.
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
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;
    }
При компиляции печаль((

Перегрузка оператора +
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
17.06.2014, 21:29     Перегрузка оператора + #7
Это из-за сложения? У тебя же оно нигде не применяется в main().
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:32  [ТС]     Перегрузка оператора + #8
Не не. в мейне я написал

C++
1
2
3
vect2 = vect + vect1;
 
    std::cout << vect2.GetLength();
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
17.06.2014, 21:36     Перегрузка оператора + #9
А почему у тебя всего 3 параметра в конструкторе? Должно же быть 6. Либо два набора координат, либо координаты и проекции.
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:37  [ТС]     Перегрузка оператора + #10
Координаты вектора в трехмерном пространстве. Этого разве не достаточно?
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
17.06.2014, 21:39     Перегрузка оператора + #11
У тебя координаты точки в трёхмерном пространстве передаются в конструктор, хотя в классе 6 параметров предусмотрено.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:39     Перегрузка оператора + #12
Цитата Сообщение от nocl1p Посмотреть сообщение
Не не. в мейне я написал
А где конструктор копирования или оператор присвоения?
У тебя в классе есть указатель, при присвоении он копируется.
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:42  [ТС]     Перегрузка оператора + #13
В моем классе 6 параметров????????????????????????????????????

Добавлено через 53 секунды
Присваивание проходит путем инициализации класса vect(6, 7, 8)
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
17.06.2014, 21:45     Перегрузка оператора + #14
Три ты динамически (зачем-то) создаёшь, ещё три просто объявлены.
Математику почитай, вектор либо координатами концов задаётся, либо начало + проекции.
uglyPinokkio
325 / 228 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:49     Перегрузка оператора + #15
Цитата Сообщение от nocl1p Посмотреть сообщение
Присваивание проходит путем инициализации класса vect(6, 7, 8)
C++
1
vect2 = vect + vect1;
Вот тут результатом оператора сложения будет объект на стеке, который копируется в vect2. Не?
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:51  [ТС]     Перегрузка оператора + #16
На счет динамического массива согласен. Не прав. Тогда как правильно объявить конструктор?
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
17.06.2014, 21:53     Перегрузка оператора + #17
В твоём случае не только в стеке. Он же ещё себе память динамически выделит на три элемента, а в стеке будет указатель.

Добавлено через 1 минуту
Может надо с T, тут я точно не уверен:
C++
1
Vector<T> operator + (const Vector<T>& vect1)
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:54  [ТС]     Перегрузка оператора + #18
Я кстати думал насчет динамического массива. Может он просто не нужен там??
nmcf
4766 / 4104 / 1371
Регистрация: 14.04.2014
Сообщений: 16,106
17.06.2014, 21:56     Перегрузка оператора + #19
Ну учитывая, что количество параметров одинаково - проще объявить все в классе.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 21:57     Перегрузка оператора +
Еще ссылки по теме:

C++ Перегрузка оператора []
Перегрузка оператора C++
C++ Перегрузка оператора
Перегрузка оператора C++
C++ Перегрузка оператора +=

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

Или воспользуйтесь поиском по форуму:
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:57  [ТС]     Перегрузка оператора + #20
В паблике как X, Y, Z?
Yandex
Объявления
17.06.2014, 21:57     Перегрузка оператора +
Ответ Создать тему
Опции темы

Текущее время: 07:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru