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

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

Восстановить пароль Регистрация
 
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 137
26.07.2014, 10:54     Как перегрузить оператор для своего класса? #1
У меня есть класс, .h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Vertex
{
public:
    ~Vertex();
    Vertex();
    double GetX();
    double GetY();
    double GetZ();
    void SetX(double x);
    void SetY(double y);
    void SetZ(double z);
    Vertex GetMinValue();
    Vertex GetMaxValue();
    Vertex operator + (Vertex a, Vertex b);
 
private:
    double m_x;
    double m_y;
    double m_z;
};
И вот здесь студия ругается error C2804: binary 'operator +' has too many parameters, хотя я даже еще реализацию не написал, что делать?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NeonLost
Пес войны
 Аватар для NeonLost
74 / 85 / 3
Регистрация: 23.02.2012
Сообщений: 653
26.07.2014, 11:30     Как перегрузить оператор для своего класса? #2
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
class %T% {
public:
    %T%() {
        //Constructor
    }
    virtual ~%T%() {
        //Destructor
    }
 
public:
// Arithmetic operators
    friend const %T% operator+(const %T%&, const %T%&);
    friend const %T% operator-(const %T%&, const %T%&);
    friend const %T% operator*(const %T%&, const %T%&);
    friend const %T% operator/(const %T%&, const %T%&);
 
// Logic operators
    friend const %T% operator==(const %T%&, const %T%&);
    friend const %T% operator!=(const %T%&, const %T%&);
};
 
// Arithmetic operators
    const %T% operator+(const %T% &lval, const %T% &rval) {
        //body
    }
    const %T% operator-(const %T% &lval, const %T% &rval) {
        //body
    }
    const %T% operator*(const %T% &lval, const %T% &rval) {
        //body
    }
    const %T% operator/(const %T% &lval, const %T% &rval) {
        //body
    }
 
// Logic operators
    const %T% operator==(const %T% &lval, const %T% &rval) {
        //body
    }
    const %T% operator!=(const %T% &lval, const %T% &rval) {
        return !(ival == rval);
    }
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
26.07.2014, 13:29     Как перегрузить оператор для своего класса? #3
NeonLost, при сравнении всё-таки bool надо возвращать. И виртуальный деструктор не нужен раньше времени.
Logumanov
 Аватар для Logumanov
15 / 11 / 2
Регистрация: 06.03.2014
Сообщений: 71
26.07.2014, 16:40     Как перегрузить оператор для своего класса? #4
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
class Vertex
{
public:
    ~Vertex();
    Vertex();
    double GetX();
    double GetY();
    double GetZ();
    void SetX(double x);
    void SetY(double y);
    void SetZ(double z);
    Vertex GetMinValue();
    Vertex GetMaxValue();
    Vertex operator +(Vertex a);
private:
    double m_x;
    double m_y;
    double m_z;
};
 
Vertex Vertex::operator+(Vertex a) {
    Vertex x;
    x.SetX(m_x+a.GetX());
    x.SetY(m_y+a.GetY());
    x.SetZ(m_z+a.GetZ());
    return x;
}
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 137
28.07.2014, 12:46  [ТС]     Как перегрузить оператор для своего класса? #5
Logumanov, Так и сделал уже, просто сразу не догнал что левый операнд и так есть this.

Добавлено через 16 часов 46 минут
Так, а как тогда перегрузить оператор умножения когда левый опернад число?
Работает сейчас так
C++
1
2
3
4
5
6
Vertex Vertex::operator * (const double& a)
{
    return *new Vertex(m_x * a, m_y * a, m_z * a, m_UserData);
}
Vertex с;
Vertex z  = c * 10;
А если мне нужно:
C++
1
Vertex z  = 10 * с;
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.07.2014, 13:08     Как перегрузить оператор для своего класса? #6
Цитата Сообщение от m0 Посмотреть сообщение
когда левый опернад число?
Нужно сделать свободную (не-член) функцию, которая будет принимать нужные типы.
C++
1
2
3
Vertex operator* (double d, const Vertex& v ) { 
//...
}
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 137
28.07.2014, 13:12  [ТС]     Как перегрузить оператор для своего класса? #7
А где описывать ее реализацию и какой у нее будет модификатор доступа?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 13:57     Как перегрузить оператор для своего класса?
Еще ссылки по теме:

Как перегрузить оператор C++
C++ Перегрузить оператор сложения для вектора

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
28.07.2014, 13:57     Как перегрузить оператор для своего класса? #8
Цитата Сообщение от m0 Посмотреть сообщение
А где описывать ее реализацию и какой у нее будет модификатор доступа?
У свободных функций нет модификатора доступа, т.к. она не принадлежит никакому классу (например как main()).
Реализация обычно на том же уровне (пространстве имен), где и класс.
Возможно ее нужно будет сделать дружественной (friend) классу (т.е. добавить в класс прототип функции с ключевым словом friend в начале), если необходим доступ к закрытой (private/protected) части класса.
Yandex
Объявления
28.07.2014, 13:57     Как перегрузить оператор для своего класса?
Ответ Создать тему
Опции темы

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