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

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

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

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

17.06.2014, 20:55. Просмотров 683. Ответов 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;
}
Что не так в перегруженном операторе +?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2014, 20:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора + (C++):

Перегрузка оператора += - C++
У меня имеется структура и метод, который вызывается след образом: A.plus_and_minus(B); Есть огромное желание перегрузить функцию += ,...

Перегрузка оператора = - C++
Есть некий класс. И два класса-наследника. Надо перегрузить оператор =, к тому же в дочерних классах вызывать перегрузку в базовом классе....

Перегрузка оператора = - C++
помогите создать перегруженный оператор = в классе Х, который будет копировать содержание строки S1 в S2.

Перегрузка оператора = - C++
Как перегрузить оператор = для char ?

Перегрузка оператора - C++
Подскажите пожалуйста, способ перегрузки операторов &gt;= и &lt;= в следующей строке if ( ob.str &gt;= '0' &amp;&amp; ob.str &lt;= '9' )Мой вариант не...

Перегрузка оператора != - C++
Помогите разобраться с перегрузкой оператора != есть класс, в котором, в разделе private объявлен указатель на массив std::string *str; ...

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

Перегрузка оператора +
0
nmcf
5349 / 4669 / 1562
Регистрация: 14.04.2014
Сообщений: 18,605
17.06.2014, 21:29 #7
Это из-за сложения? У тебя же оно нигде не применяется в main().
0
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();
0
nmcf
5349 / 4669 / 1562
Регистрация: 14.04.2014
Сообщений: 18,605
17.06.2014, 21:36 #9
А почему у тебя всего 3 параметра в конструкторе? Должно же быть 6. Либо два набора координат, либо координаты и проекции.
0
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:37  [ТС] #10
Координаты вектора в трехмерном пространстве. Этого разве не достаточно?
0
nmcf
5349 / 4669 / 1562
Регистрация: 14.04.2014
Сообщений: 18,605
17.06.2014, 21:39 #11
У тебя координаты точки в трёхмерном пространстве передаются в конструктор, хотя в классе 6 параметров предусмотрено.
1
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:39 #12
Цитата Сообщение от nocl1p Посмотреть сообщение
Не не. в мейне я написал
А где конструктор копирования или оператор присвоения?
У тебя в классе есть указатель, при присвоении он копируется.
1
nocl1p
37 / 22 / 10
Регистрация: 30.03.2012
Сообщений: 300
17.06.2014, 21:42  [ТС] #13
В моем классе 6 параметров????????????????????????????????????

Добавлено через 53 секунды
Присваивание проходит путем инициализации класса vect(6, 7, 8)
0
nmcf
5349 / 4669 / 1562
Регистрация: 14.04.2014
Сообщений: 18,605
17.06.2014, 21:45 #14
Три ты динамически (зачем-то) создаёшь, ещё три просто объявлены.
Математику почитай, вектор либо координатами концов задаётся, либо начало + проекции.
1
uglyPinokkio
326 / 229 / 41
Регистрация: 30.05.2014
Сообщений: 682
17.06.2014, 21:49 #15
Цитата Сообщение от nocl1p Посмотреть сообщение
Присваивание проходит путем инициализации класса vect(6, 7, 8)
C++
1
vect2 = vect + vect1;
Вот тут результатом оператора сложения будет объект на стеке, который копируется в vect2. Не?
1
17.06.2014, 21:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.06.2014, 21:49
Привет! Вот еще темы с ответами:

перегрузка оператора () - C++
Вопрос заключается в следующем: - Что собой представляет перегружаемый оператор()? - Как его перегрузить? ( обычные операторы тип ++ и...

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора += - C++
Создал класс дробь. Пытаюсь перегрузить оператор += (или -=, *=, /=) А компилятор выдаёт ошибку 'drob operator+=(drob&amp;)' must take...

Перегрузка оператора [] - C++
Сделал простой аналог auto_ptr для дин. массива. Файл #ifndef ARRAY_PTR_GUARD #define ARRAY_PTR_GUARD template&lt; class Ty_ &gt; ...


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

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

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