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

Перегрузка операции присваивания и сложения - C++

Войти
Регистрация
Восстановить пароль
 
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
29.09.2013, 12:52     Перегрузка операции присваивания и сложения #1
Необходимо составить описание класса для определения одномерных массивов целых чисел. Границы индексов можно задавать произвольно, т.е. массив не обязательно начинается с нуля.

При попытке сложения массивов выскакивает ошибка ("нарушение прав доступа при чтении по адресу"). Укажите ошибку, пожалуйста.

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
#include "stdafx.h"
#include <iostream>
#include <locale.h>
 
using namespace std;
 
class Vect {
    int nach, kon, *mas, *mas2;
public:
    Vect () { nach = 0; kon = 0; } 
    Vect (int n, int k);
    Vect (Vect&a); 
    void setVect (int n, int k);
    ~Vect () { delete [] mas; } 
    int getNach () { return nach; }
    int getKon () { return kon; }
    int& operator[] (int i);
    Vect& operator= (Vect& vector);
    Vect operator+ (Vect& vector);
};
 
int menu1();
int menu2();
 
Vect::Vect (int n, int k) {
    nach = n; 
    kon = k; 
    int *mas = new int [k-n+1]; 
    mas2 = mas + n;
}
 
void Vect::setVect (int n, int k) { 
    nach = n; 
    kon = k; 
    int *mas = new int [k-n+1]; 
    mas2 = mas + n;
    for (int i = nach; i < kon+1; i++)
        cin >> mas2[i];
} 
 
Vect::Vect (Vect&a) {
    nach = a.nach;
    kon = a.kon;
    int *mas = new int [kon-nach+1]; 
    mas2 = mas + nach;
    for (int i = nach; i < kon+1; i++)
        mas2[i] = a[i];
}
 
int& Vect::operator[] (int i) {
    if (i < nach || i > kon) {
        cout << "Неверный индекс." << endl;
        system("pause");
        exit(0);
    }
    return mas2[i];
}
 
Vect& Vect::operator= (Vect& vector) {
    nach = vector.nach;
    kon = vector.kon;
    int *mas = new int [kon-nach+1]; 
    mas2 = mas + nach;
    for (int i = nach; i < kon+1; i++)
        mas2[i] = vector[i];
    return *this;
}
 
Vect Vect::operator+ (Vect& vector) {
    Vect vector3(vector.nach, vector.kon);
    for (int i = nach; i < kon+1; i++) {
        vector3[i] = mas2[i] + vector[i];
    }
    return vector3;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Vect vector, vector2, vector3;
    bool men1 = true, men2 = true;
    int n, k, elem;
 
    while (men1) {
        system("cls");
        if (menu1() == 1) { // создание нового вектора
            system("cls");
            cout << "Введите границы индексов. \nНачальный: ";
            cin >> n;
            cout << "Конечный: ";
            cin >> k;
            if (n > k) {
                cout << "Ошибка. Неверные границы." << endl;
                system("pause");
                break;
            }
            cout << "Введите элементы массива: ";
            Vect vect(n, k);
            for (int i = n; i < k+1; i++)
                cin >> vect[i];
            men1 = false;
            vector = vect;
            break;
        }
        if (menu1() == 2) { // закончить работу
            system("cls");
            men1 = false;
            men2 = false;
            break;
        }
        else {
            system("cls");
            cout << "Ошибка. Повторите ввод." << endl;
            break;
        }
    }
 
    // cout << vector[3];
 
    while (men2) {
        system("cls");
        if (menu2() == 1) {
            system("cls");
            cout << "Вектор удален." << endl;
            men2 = false;
            system("pause");
            break;
        }
        if (menu2() == 2) {
            system("cls");
            Vect vect2(n, k), vect3(n, k);
            cout << "Введите элементы второго вектора: ";
            for (int i = n; i < k+1; i++)
                cin >> vect2[i];
            vect3 = vector + vect2;
            vector3 = vect3;
            break;
        }
        if (menu2() == 7) { // закончить работу
            system("cls");
            men2 = false;
            break;
        }
        else {
            system("cls");
            cout << "Ошибка. Повторите ввод." << endl;
            break;
        }
    }
 
 
 
    //vector.~Vect();
    system("pause");
    return 0;
}
 
int menu2() {
    char buf[10]; int variant;
    do {
        cout << "\n\nВыберите действие:" << endl;
        cout << "- удалить вектор (1)";
        cout << "\n- прибавить вектор (2)\n- вычесть вектор (3)" << endl;
        cout << "- умножить на скаляр (4)\n- разделить на скаляр (5)\n- закончить работу (7)" << endl;
        cin >> buf; variant = atoi(buf);
    }
    while (!variant);
    cin.get();
    return variant;
}
 
int menu1() {
    char buf[10]; int variant;
    do {
        cout << "\n\nВыберите действие:" << endl;
        cout << "- создать вектор (1)";
        cout << "\n- закончить работу (2)" << endl;
        cin >> buf; variant = atoi(buf);
    }
    while (!variant);
    cin.get();
    return variant;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 12:52     Перегрузка операции присваивания и сложения
Посмотрите здесь:

C++ Операторы сложения и присваивания
C++ Перегрузка оператора присваивания
Перегрузка оператора присваивания C++
класс strtype. перегрузка присваивания и сложения C++
Перегрузка операции + для сложения элементов динамического массива C++
C++ Перегрузка оператора присваивания
Перегрузка оператора присваивания C++
Перегрузка операции сложения в классе C++
C++ Перегрузка оператора присваивания
C++ Перегрузка оператора присваивания
Перегрузка оператора присваивания C++
C++ Перегрузка оператора присваивания

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
29.09.2013, 13:14     Перегрузка операции присваивания и сложения #2
Я не понимаю, зачем нужен mas2. В любом случае, значения ему присваиваются неверные, отсюда и все ошибки.
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
29.09.2013, 13:52  [ТС]     Перегрузка операции присваивания и сложения #3
mas2 служит для возможности задания произвольных границ. После задания элементов второго объекта, произвожу отладку с поэлементным сложением - программа работает нормально:
C++
1
2
3
4
5
6
7
8
9
for (int i = n; i < k+1; i++)
                cout << vector[i] << ' ';
            cout << endl;
            for (int i = n; i < k+1; i++)
                cout << vect2[i] << ' ';
            cout << endl;
            for (int i = n; i < k+1; i++)
                cout << vector[i] + vect2[i] << ' ';
            system("pause");
Результат:
1 2 3
3 2 1
4 4 4

При вызове же перегруженных операторов - ошибка
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
29.09.2013, 14:09     Перегрузка операции присваивания и сложения #4
Цитата Сообщение от Oberyn Martell Посмотреть сообщение
mas2 служит для возможности задания произвольных границ
Для задания произвольных границ достаточно смещения индекса, это nach:
C++
1
2
3
4
5
6
7
8
int& Vect::operator[] (int i)
{
    if (i < nach || i > kon)
    {
        throw std::out_of_range( "Неверный индекс." );
    }
    return mas[i-nach];
}
Yandex
Объявления
29.09.2013, 14:09     Перегрузка операции присваивания и сложения
Ответ Создать тему
Опции темы

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