С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 51

Как перегрузить операции?

24.10.2018, 19:54. Показов 1000. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я с горем пополам создал класс Bitstring для работы с 64-битовыми строками. Битовая строка представлена двумя полями. Реализованы все традиционные операции для работы с битами: and, or, xor, not. Реализовал сдвиг влево shiftLeft и сдвиг вправо shiftRight на заданное количество битов.

Теперь надо перегрузить такие операции для работы с битами: and, or, xor, not. Я не совсем понимаю как это делать. Почитав какое-какие статьи, я понял (возможно не правильно), что мне надо взять готовые операторы ~, &, |, ^ и заставить их делать тоже самое, но по другому. Вот только как конкретно мне это сделать?

Вот этот монстр который кое-как работает:

Bitstring.h
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
#include<iostream>
#include<string>
 
using namespace std;
 
 
class Bitstring
{
public:
    Bitstring();
    Bitstring(unsigned int);
 
    class Error {};
 
    int SizeOfBitstring();
    void Enter();
    void Show();
 
    string not();
    string and (Bitstring);
    string or (Bitstring);
    string xor (Bitstring);
 
    string rShift(unsigned int);
    string lShift(unsigned int);
    string rightCycleShift(unsigned int);
    string leftCycleShift(unsigned int);
    
private:
 
    unsigned char* unit;
    unsigned int count;
}
;
Bitstring.cpp
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include"Bitstring.h"
 
 
Bitstring::Bitstring()
{
    unit = new unsigned char;
    for (int i = 0; i < 4; i++)
        unit[i] = *"0";
}
 
Bitstring::Bitstring(unsigned int n)
{
    unit = new unsigned char;
    count = n;
    for (unsigned int i = 0; i < n; i++)
        unit[i] = *"0";
 
}
 
void Bitstring::Enter()
{
    string str;                                    // что бы энтер не нажимать запилим ввод строки
    cout << "Введите битовую строку " << endl;
    cin >> str;
 
    count = str.size();
 
    for (unsigned int i = 0; i < count; i++)          // проверка
        if ((str.at(i) != *"0") && (str.at(i) != *"1"))
            throw Error();                         //генерация исключения
 
    unit = new unsigned char;
 
    for (unsigned int i = 0; i < count; i++)        // вбиваем в массив нашу строку
        unit[i] = str.at(i);
}
 
void Bitstring::Show()
{
 
    for (unsigned int i = 0; i < count; i++)
        cout << unit[i];
 
}
 
int Bitstring::SizeOfBitstring()
{
    return count;
}
 
string Bitstring::not()
{
    string str;
 
    for (unsigned int i = 0; i < count; i++)
    {
        if (unit[i] == *"0")
            unit[i] = *"1";
        else
            if (unit[i] == *"1")
                unit[i] = *"0";
 
        str += unit[i];
    }
 
 
    return str;
 
}
 
string Bitstring:: and (Bitstring B)
{
    string str;
 
    for (unsigned int i = 0; i < count; i++)
    {
        if ((unit[i] == *"0") && (B.unit[i] == *"1"))
            str += *"0";
        else
            if ((unit[i] == *"1") && (B.unit[i] == *"0"))
                str += *"0";
            else
                str += unit[i];
    }
 
 
    return str;
}
 
string Bitstring:: or (Bitstring B)
{
    string str;
 
    for (unsigned int i = 0; i < count; i++)
    {
        if ((unit[i] == *"0") && (B.unit[i] == *"1"))
            str += *"1";
        else
            if ((unit[i] == *"1") && (B.unit[i] == *"0"))
                str += *"1";
            else
                str += unit[i];
    }
 
 
    return str;
}
 
string Bitstring:: xor (Bitstring B)
{
    string str;
 
    for (unsigned int i = 0; i < count; i++)
    {
        if ((unit[i] == *"0") && (B.unit[i] == *"1"))
            str += *"1";
        else
            if ((unit[i] == *"1") && (B.unit[i] == *"0"))
                str += *"1";
            else
                if ((unit[i] == *"0") && (B.unit[i] == *"0"))
                    str += *"0";
                else
                    if ((unit[i] == *"1") && (B.unit[i] == *"1"))
                        str += *"0";
 
    }
 
 
    return str;
}
 
string Bitstring::rShift(unsigned int n)
{
    string str;
 
    for (unsigned int i = 0; i < count; i++)
        str += unit[i];
 
    str.erase(0, n);  // удаляем n символов начитая с первого
 
    for (int i = 0; i < n; i++)                    // добавляем n нулей в конец
        str.append("0");
 
 
    return str;
}
 
string Bitstring::lShift(unsigned int n)
{
    string str;
 
    for (unsigned int i = 0; i < count; i++)
        str += unit[i];
 
    str.erase(count - n, n);  // удаляем n символов начитая с первого                   
 
    str.insert(0, n, *"0");           // добавляем n нулей в  начало
 
    return str;
}
 
string Bitstring::rightCycleShift(unsigned int n)
{
    string str;
 
 
 
    for (unsigned int i = n; i < count; i++)
        str += unit[i];
 
    for (unsigned int i = 0; i < n; i++)
        str += unit[i];
 
    return str;
 
}
 
string Bitstring::leftCycleShift(unsigned int n)
{
    string str;
 
    for (unsigned int i = count - n; i < count; i++)
        str += unit[i];
 
    for (unsigned int i = 0; i < count - n; i++)
        str += unit[i];
 
    return str;
}
lab.cpp
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
#include"Bitstring.h"
 
int main()
{
    setlocale(.1251, "");
 
    Bitstring B, B1;
    try
    {
 
        B.Enter();
        B1.Enter();
        if (B.SizeOfBitstring() != B1.SizeOfBitstring())
            throw Bitstring::Error();
 
        int key = 0;
        while (key != 11)
        {
            cout << "Нажмите (1) если хотите сложить битовые строки" << endl
                << "Нажмите (2) если хотите перемножить битовые строки" << endl
                << "Нажмите (3) если хотите сложить по модулю битовые строки " << endl
                << "Нажмите (4) если хотите выполнить побитовое отрицание  строк" << endl
                << "Нажмите (5) если хотите выполнить побитовый сдвиг вправо строк" << endl
                << "Нажмите (6) если хотите выполнить побитовый сдвиг влево  строк " << endl
                << "Нажмите (7) если хотите выполнить циклический сдвиг строк вправо   " << endl
                << "Нажмите (8) если хотите выполнить циклический сдвиг строк влево  " << endl
                << "Нажмите (9) если хотите узнать состояние строк" << endl
                << "Нажмите (10) если хотите очистить экран" << endl
                << "Нажмите (11) если хотите выйти" << endl;
            cin >> key;
 
            switch (key)
            {
            case 1: { cout << endl << "Сумма равна :" << B. or (B1) << endl << endl; break;}
            case 2: { cout << endl << "Произведение равно :" << B. and (B1) << endl << endl; break;}
            case 3: { cout << endl << "Сумма по модулю равна : " << B. xor (B1) << endl << endl; break;}
            case 4: { cout << endl << "Побитовое отрицание первой строки равно " << B.not() << endl
                << "Побитовое отрицание второй строки равно " << B1.not() << endl << endl; break;}
            case 5: {
                cout << " На сколько будем двигать строки?" << endl;
                unsigned int n;
                cin >> n;
                if (n < 0)
                    throw Bitstring::Error();
                cout << "Результаты побитового сдвига:" << endl
                    << "   первая строка - " << B.rShift(n) << endl
                    << "   вторая строка - " << B1.rShift(n) << endl << endl;
                break;
            }
            case 6: {
                cout << " На сколько будем двигать строки?" << endl;
                unsigned int n;
                cin >> n;
                if (n < 0)
                    throw Bitstring::Error();
                cout << "Результаты побитового сдвига:" << endl
                    << "   первая строка - " << B.lShift(n) << endl
                    << "   вторая строка - " << B1.lShift(n) << endl << endl;
                break;
            }
            case 7: {
                cout << " На сколько будем двигать строки?" << endl;
                unsigned int n;
                cin >> n;
                if (n < 0)
                    throw Bitstring::Error();
                cout << "Результаты побитового сдвига:" << endl
                    << "    первая строка - " << B.rightCycleShift(n) << endl
                    << "    вторая строка - " << B1.rightCycleShift(n) << endl << endl;
                break;
            }
            case 8: {
                cout << " На сколько будем двигать строки?" << endl;
                unsigned int n;
                cin >> n;
                if (n < 0)
                    throw Bitstring::Error();
                cout << "Результаты побитового сдвига:" << endl
                    << "    первая строка - " << B.leftCycleShift(n) << endl
                    << "    вторая строка - " << B1.leftCycleShift(n) << endl << endl;
                break;
            }
            case 9: {
                cout << "Первая строка ";  B.Show(); cout << endl;
                cout << "Вторая строка "; B1.Show(); cout << endl << endl;
                break;
            }
 
 
            case 10:  system("cls"); break;
            }
        }
 
 
    }
    catch (Bitstring::Error)
    {
        cout << "Ошибка! Введенное значение некорректно!" << endl;
    }
    return 0;
 
}
Вот то, что я добавлял когда пытался перегрузить оператор &

Bitstring.h
C++
1
string operator & (Bitstring);
Bitstring.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
string Bitstring::operator & (Bitstring B);
{
    string str;
 
    for (unsigned int i = 0; i < count; i++)
    {
        if ((unit[i] == *"0") && (B.unit[i] == *"1"))
            str += *"0";
        else
            if ((unit[i] == *"1") && (B.unit[i] == *"0"))
                str += *"0";
            else
                str += unit[i];
    }
 
 
    return str;
 
}
Когда я попросил преподавателя мне помочь, то он только дописал мне одну строчку внутри другой функции и я не пойму, что мне с ней делать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string Bitstring::leftCycleShift(unsigned int n)
{
    string str;
 
    for (unsigned int i = count - n; i < count; i++)
        str += unit[i];
 
    for (unsigned int i = 0; i < count - n; i++)
        str += unit[i];
 
    return str;
    Bitstring operator && (Bitstring M1, Bitstring M2)
    {
 
    }
}
Заранее спасибо

Добавлено через 33 минуты
Я тут нашел более лучший пример и попытался сделать по нему.

В Bitstrin.h пишет "не найдено определение функции operator&"
C++
1
Bitstring operator&(Bitstring a);
А в Bitstring.cpp пишет "функция-член "Bitstring::operator &" не может быть повторно объявлена вне соответствующего класса
C++
1
2
3
4
5
6
7
Bitstring Bitstring::operator & (Bitstring a);
{
    Bitstring res;
    res = B & B1;
    cout << "&=";
    return res;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.10.2018, 19:54
Ответы с готовыми решениями:

Перегрузить операции сравнения комплексных чисел и операции потокового вывода
Создать класс комплексное число. Перегрузить операции сравнения комплексных чисел! =, ==,&gt;, &lt;,&gt; =, &lt;= И операции потокового...

Перегрузить операции +, +=, ==, [], ()
Для класса String перегрузить операции + + = == () таким образом, чтобы обеспечивалось выполнение следующих операций: ...

Перегрузить операции
Здравствуйте! Есть уже готовая программа , но в ней нужно перегрузить операции + добавление элемента; - удаление элемента; ...

5
44 / 20 / 14
Регистрация: 23.10.2018
Сообщений: 103
24.10.2018, 20:13
Вот пример перегрузки для понимания:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class BitString {
public:
    BitString operator&(const BitString& string2) const {
        // выполнение какого-то кода при необходимости и возврат результата
    }
};
 
int main() {
    BitString b, b2;
    
    auto c = b & b2;
    
    return 0;
}
На заметку, в C++ есть std::bitset.

Добавлено через 2 минуты
Цитата Сообщение от Gureyn Посмотреть сообщение
unit = new unsigned char;
* * for (int i = 0; i < 4; i++)
* * * * unit[i] = *"0";
Предполагаю, что здесь есть какие-то ошибки.

Добавлено через 2 минуты
Почему нельзя для реализации 64-битовых строк использовать целые числа, ? Задание такое? При использовании целых чисел всё будет работать быстрее и требовать меньше памяти.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
24.10.2018, 21:24
Цитата Сообщение от Gureyn Посмотреть сообщение
Вот этот монстр который кое-как работает
Позвольте не поверить, Gureyn, это работать не будет. Не перегруженные операторы, которых пока нет, а вообще.

Посмотрите, что вы делаете.

Конструкторы. Выделяете память размером 1 байт (unsigned char, но писать "байт" короче). И тут же пишите, начиная с этого адреса, 4 байта (или n байт; хорошо, если n == 1) информации. В конструкторе без параметров не инициализируется переменная count, т.е. после отработки конструктора она содержит мусор.

Деструктор отсутствует. Ну да, зачем он нужен? Память выделили, а очищать - пусть операционка заботится, когда приложение завершится.

Ну и по мелочи...

Кто вас научил писать char c = *"0"? Если сами додумались, молодец, конечно, но так не надо. Для типа char (unsigned char) существуют литералы: char c = '0'.

Сильно не понравилось, что вы в своём классе активно используете std::string. Т.е. у вас есть объект типа BitString, вы вызываете метод rShift() и на выходе получаете std::string. Причём сам объект при этом не изменился. Работайте в контексте вашего класса! А std::string - это для вспомогательных методов и/или операций. Т.е. для конвертирования BitString в std::string и обратно. Чисто для удобства пользования классом.

Про перегрузку операторов лучше почитайте в книжке. В двух словах тут не расскажешь.

Препод воткнул функцию не так, не туда и не с теми аргументами. А в остальном - правильно.
0
0 / 0 / 0
Регистрация: 14.11.2017
Сообщений: 51
25.10.2018, 10:14  [ТС]
Если б оно не работало, то я б его не запустил и не смог бы протестить. Но у меня не получается не запустить его, а перегрузить операторы. А так спасибо за советы.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.10.2018, 12:50
Цитата Сообщение от Gureyn Посмотреть сообщение
Если б оно не работало, то я б его не запустил и не смог бы протестить.
Так могло бы быть в каком-нибудь другом языке, но не в C++. В С++ вы можете вполне запускать и тестировать нерабочий код и даже какое-то время получать от него ожидаемое поведение. А все дело в том, что в С++ львиная доля ошибок не нуждается в диагностике компилятором (чаще всего потому, что в общем случае ее невозможно обеспечить), поэтому надеяться на то, что раз код скомпилировался, значит в нем нет ошибок - не стоит.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
25.10.2018, 18:38
Я же не говорил, что компилироваться или запускаться не будет. Я сказал, что работать не будет, если вы, как минимум, не поправите конструкторы. Программа будет вылетать в самые непредсказуемые моменты с невразумительной диагностикой.

Впрочем, если хотите поиграть в футбол на минном поле с завязанными глазами - welcome!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.10.2018, 18:38
Помогаю со студенческими работами здесь

Перегрузить операции очереди
Очередь. Дополнительно перегрузить следующие операции: · + - добавить элемент; · извлечь элемент; · bool() – проверка,...

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

Перегрузить операции добавления/извлечения из стека
Класс - стек stack. Дополнительно перегрузить следующие операции: + -Добавить элементы в стек - -Извлечь элемент

динамический стек (перегрузить операции +, +=, -= в динами)
скажите пожалуйста, как перегрузить операции +, +=, -= в динамическом стеке???

Перегрузить операторную функцию для операции !
Доброго времени суток форумчане! Задание звучит так:Дополнительно перегрузить операторную функцию для операции ! (логическое отрицание),...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru