Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 145
#1

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

26.07.2014, 10:54. Просмотров 406. Ответов 7
Метки нет (Все метки)

У меня есть класс, .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, хотя я даже еще реализацию не написал, что делать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2014, 10:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как перегрузить оператор для своего класса? (C++):

Как правильно перегрузить оператор для шаблона класса
Имеется такой шаблон: template<int Low = 0, int High = 1000> class Diapazon...

Как перегрузить оператор для класса. Хоть убейте, не могу
Нужно поэлементно скопировать строки. Поэлементно, потому что задания другие,...

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор *
Помогите в следующем: Для класса шаблона следует перегрузить оператор...

Перегрузить для класса оператор ==
немогу написать продолжение кода... нужно написать : перегрузить для...

Перегрузить оператор присваивания для класса
Помогите, пожалуйста. Требуется написать оператор присваивания для данного...

Перегрузить для класса оператор == (много ошибок)
не могу разабраться в чем ошибки при компиляции... помогите пожалуйста код:...

7
NeonLost
Пес войны
110 / 87 / 22
Регистрация: 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);
    }
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
26.07.2014, 13:29 #3
NeonLost, при сравнении всё-таки bool надо возвращать. И виртуальный деструктор не нужен раньше времени.
0
Logumanov
15 / 11 / 3
Регистрация: 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;
}
1
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 145
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 * с;
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
28.07.2014, 13:08 #6
Цитата Сообщение от m0 Посмотреть сообщение
когда левый опернад число?
Нужно сделать свободную (не-член) функцию, которая будет принимать нужные типы.
C++
1
2
3
Vertex operator* (double d, const Vertex& v ) { 
//...
}
0
m0
2 / 2 / 1
Регистрация: 03.12.2013
Сообщений: 145
28.07.2014, 13:12  [ТС] #7
А где описывать ее реализацию и какой у нее будет модификатор доступа?
0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
28.07.2014, 13:57 #8
Цитата Сообщение от m0 Посмотреть сообщение
А где описывать ее реализацию и какой у нее будет модификатор доступа?
У свободных функций нет модификатора доступа, т.к. она не принадлежит никакому классу (например как main()).
Реализация обычно на том же уровне (пространстве имен), где и класс.
Возможно ее нужно будет сделать дружественной (friend) классу (т.е. добавить в класс прототип функции с ключевым словом friend в начале), если необходим доступ к закрытой (private/protected) части класса.
0
28.07.2014, 13:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.07.2014, 13:57
Привет! Вот еще темы с решениями:

Перегрузить оператор () для пользовательского класса Matrix
Суть, есть класс matrix , есть int **p(матрица) и int row, col; , нужно...

Как перегрузить оператор "+" для шаблонного класса, инстанцированного разными типами?
подскажите как перегрузить оператор "+" для шаблона , инстанцированных разными...

Создать копирующий конструктор для класса матрицы и перегрузить оператор <<
Пытаюсь создать копирующий конструктор для класса матрицы и перегрузить...

Как перегрузить оператор [][] для разреженной матрицы?
как перегрузить оператор для разреженной матрицы?знаю, что такого оператора...


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

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

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