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

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

Восстановить пароль Регистрация
 
Jacen
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 5
05.06.2012, 13:46     Перегрузка операторов #1
Приветствую! Необходима помощь.
Разработать класс Vec4 как вектор из 4-х float. Определить оператор ~ для перестановки элементов вектора в обратном порядке и операторы ввода >> и вывода <<. Напишите тестирующую программу.

Программу написал, но она не работает, равно как и пара найденных в интернете примеров. Что я не подключил/в чем ошибка?

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
#include <iostream>
using namespace std;
 
class Vec4{
public:
    float vector[4]; 
    float vectemp;
    void operator ~(float *vector){
        vectemp=vector[0];
        vector[0]=vector[3];
        vector[3]=vectemp;
        vectemp=vector[1];
        vector[1]=vector[2];
        vector[2]=vectemp;
    };
    friend istream operator >>(istream& cin_, float *vector){
        for (int i=0; i<4; i++){
            cin_>>vector[i];}
    return cin_;
    };
    friend ostream operator <<(ostream& cout_, float *vector){
    cout_<<vector[0]<<", "<<vector[1]<<", "<<vector[2]<<", "<<vector[3];
    return cout_;
    };
};
Vec4 vector1;
void main(){
    int n;
    cin >> vector1;
    cout << vector1; 
    ~vector1;
}
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2012, 13:46     Перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
C++ Перегрузка операторов
Перегрузка операторов С++ C++
C++ перегрузка операторов
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 14:17     Перегрузка операторов #2
Тильда - это деструктор, а не оператор.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
05.06.2012, 14:20     Перегрузка операторов #3
Почему же, есть такой оператор, только он унарный.

Добавлено через 36 секунд
Если не ошибаюсь, это побитовое НЕ.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
05.06.2012, 14:25     Перегрузка операторов #4
Цитата Сообщение от Jacen Посмотреть сообщение
void operator ~(float *vector){
в скобках пишется только второй операнд, первый - это
C++
1
*this
, он неявный.
Jacen
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 5
07.06.2012, 17:35  [ТС]     Перегрузка операторов #5
Цитата Сообщение от taras atavin Посмотреть сообщение
*this
Понятно, убрал аргумент, ругаться перестало.

Что неправильно в перегрузке ввода-вывода?
sandye51
программист С++
 Аватар для sandye51
677 / 579 / 39
Регистрация: 19.12.2010
Сообщений: 2,016
07.06.2012, 18:09     Перегрузка операторов #6
Цитата Сообщение от Jacen Посмотреть сообщение
Что неправильно в перегрузке ввода-вывода?
ссылку на поток надо возвращать
Jacen
0 / 0 / 0
Регистрация: 28.05.2012
Сообщений: 5
07.06.2012, 18:17  [ТС]     Перегрузка операторов #7
Апдейт(сообщение почему то не редактируется). Разобрался, все работает.
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
#include <iostream>
using namespace std;
class Vec4{
public:
    float vector[4]; 
    float vectemp;
    void operator ~(){
        vectemp=vector[0];
        vector[0]=vector[3];
        vector[3]=vectemp;
        vectemp=vector[1];
        vector[1]=vector[2];
        vector[2]=vectemp;
    };
    friend istream & operator >>(istream & input, Vec4 &vector){
        for (int i=0; i<4; i++){
            input>>vector.vector[i];}
    return input;
    };
    friend ostream & operator <<(ostream & output, Vec4 vector){
        for (int i=0; i<4; i++){
            output<<vector.vector[i];}
    return output;
    };
};
Vec4 vector1;
void main(){
    cin >> vector1;
    cout << vector1; 
    cout <<"\n";
    ~vector1;
    cout << vector1;
}
kent
Нуб со стажем
 Аватар для kent
36 / 34 / 2
Регистрация: 19.02.2012
Сообщений: 118
07.06.2012, 19:20     Перегрузка операторов #8
Цитата Сообщение от Jacen Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Vec4{
public:
    float vector[4]; 
    float vectemp;
    void operator ~(){
        vectemp=vector[0];
        vector[0]=vector[3];
        vector[3]=vectemp;
        vectemp=vector[1];
        vector[1]=vector[2];
        vector[2]=vectemp;
    };
    friend istream & operator >>(istream & input, Vec4 &vector){
        for (int i=0; i<4; i++){
            input>>vector.vector[i];}
    return input;
    };
    friend ostream & operator <<(ostream & output, Vec4 vector){
        for (int i=0; i<4; i++){
            output<<vector.vector[i];}
    return output;
    };
};
лучше переписать вот так:
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
class Vec4{
private:
    float _x,_y,_z,_t;
public:
    Vec4(float x=0,float y=0,float z=0,float t=0){
        _x=x; 
        _y=y;
        _z=z;
        _t=t;
    }
    
    Vec4&operator~(void){
        float buf=_x;
        _x=_t;
        _t=buf;
        buf=_y;
        _y=_z;
        _z=buf;
        return *this;
    }
 
    friend istream & operator >>(istream & input, Vec4 &vector);    
        friend ostream & operator <<(ostream & output, Vec4 vector);
}
 
istream & operator >>(istream & input, Vec4 &vector){
    input>>_x>>_y>>_z>>_t;
    return input;
}
 
ostream & operator <<(ostream & output, Vec4 vector){
    output<<_x<<' '<<_y<<' '<<_z<<' '<<_t;
        return output;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.06.2012, 13:21     Перегрузка операторов
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
08.06.2012, 13:21     Перегрузка операторов #9
Цитата Сообщение от kent Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
Vec4&operator~(void){
    float buf=_x;
    _x=_t;
    _t=buf;
    buf=_y;
    _y=_z;
    _z=buf;
    return *this;
}
 
friend istream & operator >>(istream & input, Vec4 &vector);    
friend ostream & operator <<(ostream & output, Vec4 vector);
А еще лучше вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Vec4 operator~() const {
    return Vec4(_t, _z, _y, _x);
}
 
template <typename _CharT, class _Traits>
friend std::basic_istream<_CharT, _Traits>& operator>>(std::basic_istream<_CharT, _Traits>&, abc&);
 
template <typename _CharT, class _Traits>
friend std::basic_ostream<_CharT, _Traits>& operator<<(std::basic_ostream<_CharT, _Traits>&, const abc&);
 
/*
    ...
*/
 
template <typename _CharT, class _Traits>
std::basic_istream<_CharT, _Traits>& operator>>(std::basic_istream<_CharT, _Traits>& is, abc& a) {
    return is >> a._x >> a._y >> a._z >> a._t;
}
 
template <typename _CharT, class _Traits>
std::basic_ostream<_CharT, _Traits>& operator<<(std::basic_ostream<_CharT, _Traits>& os, abc& a) {
    return os << a._x << ' ' << a._y << ' ' << a._z << ' ' << a._t;
}
Yandex
Объявления
08.06.2012, 13:21     Перегрузка операторов
Ответ Создать тему
Опции темы

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