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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 28, средняя оценка - 5.00
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
#1

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

11.11.2011, 01:32. Просмотров 3888. Ответов 38
Метки нет (Все метки)

Имеется такая программа:
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
class reversion
{ 
    vector<int> mass1;
    vector<int> mass2;
    vector<int> rev1;
    vector<int> rev2;
        vector<int> mult1;
    vector<int> mult2;
    int len;
    public:
    reversion(){len=0;}
    void record1();      // Функция записывае в вектора mass1 и rev1 данные
    void record2();       // Функция записывае в вектора mass2 и rev2 данные
    reversion operator *(reversion mult);            // этот оператор делает определенные действия с векторами mass1 и rev1 и mass2 и rev2.
    reversion operator <<(reversion display); вывод на дисплей векторов mult1 и mult 2, которые были изменены через оператор *
};
void reversion::record1()
{   
    int x=1;
    int i=0;
    cout<<"Введите 1 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass1.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass1[i]<<" ";
    cout<<endl;
    x=1;
    i=0;
    cout<<"Введите 1 перестановку"<<endl;
        for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev1.push_back(x);
                k++;
            }
        }
        int z=0;
        for(int i=k-1;i>=0;i--)
            if(mass1[i]==rev1[i])
            {
                mass1.pop_back();
                rev1.pop_back();
                z++;
            }
            else
                break;
            k=k-z;
}
void reversion::record2()
{
    int x=1;
    int i=0;
    cout<<"Введите 2 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass2.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass2[i]<<" ";
    cout<<endl;
        x=1;
        i=0;
    cout<<"Введите 2 перестановку"<<endl;
    for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev2.push_back(x);
                p++;
            }
        }
        int z=0;
        for(int i=p-1;i>=0;i--)
            if(mass2[i]==rev2[i])
            {
                mass2.pop_back();
                rev2.pop_back();
                z++;
            }
            else
                break;
            p=p-z;
    cout<<endl;
}
reversion reversion::operator *(reversion mult)
{
    reversion D;
    int f=k;
    int z=0;
    if(k>p)
    {
        f=k;
        for(int i=p;i<k;i++)
        {
            D.mass2.push_back(i+1);
            D.rev2.push_back(i+1);
        }
    }
    if(k<p)
    {
        f=p;
        for(int i=k;i<p;i++)
        {
            D.mass1.push_back(i+1);
            D.rev1.push_back(i+1);
        }
    }
    
    int k=0;
    for(int i=0;i<f;i++)
    {
        k=D.rev1[i];
        for(int j=0;j<f;j++)
        {
            if(D.mass2[j]==k)
                D.mult2.push_back(rev2[j]);
        }
    }
    return D;
}
reversion reversion::operator <<(reversion display)
{
    reversion F;
    for(int i=0;i<p;i++)
        cout<<F.mult1[i]<<" ";
    cout<<endl;
    for(int i=0;i<p;i++)
        cout<<F.mult2[i]<<" ";
    cout<<endl<<endl;
    return F;
}
void main()
{  
    setlocale (LC_ALL,"RUS");
    reversion A;
    A.record1();
    reversion B;
    B.record2();
    reversion C;
    C<<A*B;         
    getch();
}
У меня такая проблема, когда вызывается оператор *, то он не видит то, что было проделано в функции record1(); видит только то что было в record2();

Добавлено через 34 минуты
Кто-нибудь знает почему так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 01:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос перегрузка операторов (C++):

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

[c++] Перегрузка операторов - C++
Не работает. #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #pragma argsused struct FazzyNumber { double x; double x1,x2; ...

Перегрузка операторов - C++
Помогите решить задачу на c++ мучаюсь 3 день Перегрузить операторы «==» и «!=» для строк. Оператор «==» возвращает соответственно 1,...

Перегрузка операторов - C++
Доброй ночи! Изучаю перегрузку операторов. Создал класс Дробь, где в качестве данных выступают числитель и знаменатель дроби. ...

Перегрузка операторов - C++
Осуществите перегрузку оператора “+=” так, чтобы при его использовании сумма увеличивалась на 5. Помогите, срочно.

Перегрузка операторов - C++
Пытаюсь написать такой код: char* operator+(char *s1, char *s2) { return &quot;&quot;; } выдаёт ошибку: http://codepad.org/KS8qU8Ml...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 15:13 #16
Smillles7, если меня не подводит память, то перестановка - это такая матрица с двумя строчками, где в первой строке - индексы i по порядку от 1 до N, а во второй строке записаны числа, соответствующие этим индексам (тоже от 1 до N, но в произвольном порядке). Например,
1 2 3 4 5 6
2 3 6 1 5 4
Так вот, тут вам нужно максимум 2 вектора, если вы хотите хранить эти наборы цифр отдельно.
Поэтому и удивилась количеству векторов.

Или вы под подстановкой понимаете что-то другое? И на форуме вряд ли все помнят, что такое умножение перестановок. Например, я не помню, поэтому и не могу написать, что вам переделать в операторе *, помимо отказа от локальной переменной D и использования параметров, с которыми оператор вызывается. Поэтому вопрос про постановку задачи остался открытым.
Deviaphan
11.11.2011, 15:26
  #17

Не по теме:

Цитата Сообщение от Smillles7 Посмотреть сообщение
перегрузка операторов)))
Операторов ))) не существует. Пичалька.

Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 21:17  [ТС] #18
Цитата Сообщение от aeshes Посмотреть сообщение
Smillles7, если меня не подводит память, то перестановка - это такая матрица с двумя строчками, где в первой строке - индексы i по порядку от 1 до N, а во второй строке записаны числа, соответствующие этим индексам (тоже от 1 до N, но в произвольном порядке). Например,
1 2 3 4 5 6
2 3 6 1 5 4
Так вот, тут вам нужно максимум 2 вектора, если вы хотите хранить эти наборы цифр отдельно.
Поэтому и удивилась количеству векторов.

Или вы под подстановкой понимаете что-то другое? И на форуме вряд ли все помнят, что такое умножение перестановок. Например, я не помню, поэтому и не могу написать, что вам переделать в операторе *, помимо отказа от локальной переменной D и использования параметров, с которыми оператор вызывается. Поэтому вопрос про постановку задачи остался открытым.
Вы правильно поняли) 2 ыектора уходят на 1 перестановку, 2 на вторую перестановку, 1 вектор на их перемножение, 1 вектор на нахождение обратной перестановки и 3 вектор на тождественную перестановку))
Всем спасибо) сейчас буду читать книги) и попробовать сделать перегрузку, если не получиться напишу на форуме и полностью опишу программу и что она должна делать)))
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.11.2011, 21:21 #19
Smillles7, обрати внимание на следующее: к лассе Перестановка должны быть поля ТОЛЬКО ДЛЯ ОДНОЙ перестановки. То есть массив индексов и массив чисел. Операция умножения перестановок использует 2 операнда, но эти два операнда - ДВА РАЗНЫХ ОБЪЕКТА- перестановки. Левым аргументом является текущий объект (см. this), правым - параметр операции. И еще результат - ТРЕТИЙ ОБЪЕКТ. В каждом из объектов - СОБСТВЕННЫЕ два массива. ТОЛЬКО ДВА.
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.11.2011, 21:23 #20
Smillles7, тогда вы просто не понимаете, что такое классы. В классе Перестановка должно быть ровно 2 вектора (хотя можно и одним обойтись). А когда вы будете создавать перестановки А, В, вы должны в них заполнять эти 2 вектора - индексы и значения. Т.е., в А будет своя табличка
1 2 3 4
2 3 4 1
в В будет своя
1 2 3 4
2 1 4 3
Когда будете писать С=А*В, то в эти два вектора для объекта С запишется результат перестановки.
Т.е. С будет содержать табличку
1 2 3 4
3 4 1 2 (цифры написала произвольные, потому что не помню, что такое умножение перестановок)

Не надо в каждом объекте хранить векторы для всех действий над перестановками.

Опоздала) ValeryLaptev уже написал
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:06  [ТС] #21
Как то размыто я понял то что вы написали) Сейчас почитаю книгу Дейтела и попробую написать)

Добавлено через 55 минут
Если я вас правильно понял то получается что то типа этого:
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <vector>
using namespace std;
int s=2;
int k=0;
int p=0;
class reversion
{ 
    vector<int> mass1;
    vector<int> rev1;
    int len;
    public:
    reversion(){len=0;}
    void record1();
    void record2();
    reversion operator *();
    reversion operator <<();
 
};
void reversion::record1()
{   
    int x=1;
    int i=0;
    cout<<"Введите 1 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass1.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass1[i]<<" ";
    cout<<endl;
    x=1;
    i=0;
    cout<<"Введите 1 перестановку"<<endl;
        for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev1.push_back(x);
                k++;
            }
        }
        int z=0;
        for(int i=k-1;i>=0;i--)
            if(mass1[i]==rev1[i])
            {
                mass1.pop_back();
                rev1.pop_back();
                z++;
            }
            else
                break;
            k=k-z;
}
void reversion::record2()
{
    int x=1;
    int i=0;
    cout<<"Введите 2 массив"<<endl;
    cin>>x;
    for(int i=1;i<=x;i++)
        mass1.push_back(i);
    for(int i=0;i<x;i++)
        cout<<mass1[i]<<" ";
    cout<<endl;
        x=1;
        i=0;
    cout<<"Введите 2 перестановку"<<endl;
    for(int i=0;x!=0;i++)
        {
            cin>>x;
            if(x!=0)
            {
                rev1.push_back(x);
                p++;
            }
        }
        int z=0;
        for(int i=p-1;i>=0;i--)
            if(mass1[i]==rev1[i])
            {
                mass1.pop_back();
                rev1.pop_back();
                z++;
            }
            else
                break;
            p=p-z;
    cout<<endl;
}
reversion reversion::operator *()
{
    int f=k;
    int z=0;
    if(k>p)
    {
        f=k;
        for(int i=p;i<k;i++)
        {
            B.mass1.push_back(i+1);
            B.rev1.push_back(i+1);
        }
    }
    if(k<p)
    {
        f=p;
        for(int i=k;i<p;i++)
        {
            A.mass1.push_back(i+1);
            A.rev1.push_back(i+1);
        }
    }
    
    int k=0;
    for(int i=0;i<f;i++)
    {
        k=A.rev1[i];
        for(int j=0;j<f;j++)
        {
            if(B.mass2[j]==k)
                B.mult2.push_back(B.rev2[j]);
        }
    }
}
reversion reversion::operator <<()
{
    for(int i=0;i<p;i++)
        cout<<C.mass1[i]<<" ";
    cout<<endl;
    for(int i=0;i<p;i++)
        cout<<C.rev1[i]<<" ";
    cout<<endl<<endl;
}
void main()
{  
    setlocale (LC_ALL,"RUS");
    reversion A;
    A.record1();
    reversion B;
    B.record2();
    reversion C;
    C<<A*B;
    getch();
}
но тогда что нужно писать в аргументах операции * и <<
????
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
11.11.2011, 23:29 #22
в функции перегрузки операторов вам надо передать рефернсы на объекты над которыми вы собираетесь выполнять действия.
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:31  [ТС] #23
Что такое референсы? покажите примерно как это делается))
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 23:39 #24
Цитата Сообщение от Smillles7 Посмотреть сообщение
Что такое референсы?
ссылки
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.11.2011, 23:40 #25
Цитата Сообщение от Smillles7 Посмотреть сообщение
Что такое референсы? покажите примерно как это делается))
Референсы - это ссылки.
Прототип выглядит так:
C++
1
тип operator*(const тип& R);
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:46  [ТС] #26
мне нужно передать два вектора и + несколько int переменных, а он жалуется что:
слишком много параметров для этой функции оператора)
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
11.11.2011, 23:54 #27
Smillles7, одно из правил перегрузки операций - нельзя менять арность операции. Операция умножения - бинарная, поэтому операндов может быть только два: левый аргумент - текущий объект (для него не нужно параметра), и правый аргумент - это параметр перегружаемой операции.
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
11.11.2011, 23:55 #28
Цитата Сообщение от Smillles7 Посмотреть сообщение
мне нужно передать два вектора и + несколько int переменных, а он жалуется что:
слишком много параметров для этой функции оператора)
вам надо передать экземпляры класса в функцию перегрузки операторов, а не векторы.
Smillles7, сформулируйте четко задачу которую вы пытаетесь решить.попробую написать вам класс и функции перегрузки операторов которые вам нужны.
Smillles7
25 / 25 / 1
Регистрация: 23.04.2011
Сообщений: 130
11.11.2011, 23:56  [ТС] #29
Класс перестановка на n элементном множестве.
перестановки пример:
123456.....
352614
реализовать операции:
1) перемножение перестановок
т.е
1234 * 1234 = 1234
3241 * 2143 = 4132
2) нахождение обратной перестановки
3) Тождественная перестановка
Мне нужно что бы в void main было примерно так:
С=A*B^B;
т.е мы перемножаем две перестановки и потом находим обратную к этим перемноженым перестановкам(оператор ^)
greeezz
272 / 165 / 4
Регистрация: 10.07.2011
Сообщений: 441
11.11.2011, 23:57 #30
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
левый аргумент - текущий объект (для него не нужно параметра)
ну это если функция перегрузки является членом класса. если функция глобальная то должна являтся другом класса и тогда нужны два аргумента.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 23:57
Привет! Вот еще темы с ответами:

Перегрузка операторов - C++
Всем привет. Предположим, что нужно перегрузить оператор вывода &lt;&lt; для какого-то класса, определенного мной. Этот оператор должен выводить...

Перегрузка операторов - C++
Помогите, пожалуйста, решить задачу При создании собственных типов данных с помощью классов наиболее общей операцией является проверка...

Перегрузка операторов - C++
Объясните, пожалуйста, что означает, эта строка? return a != t1.a &amp;&amp; b != t1.b ? 1 : 0; что означает ? 1 : 0; ? Заранее...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.11.2011, 23:57
Ответ Создать тему
Опции темы

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