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

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

Войти
Регистрация
Восстановить пароль
 
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
#1

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

29.09.2013, 12:52. Просмотров 707. Ответов 3
Метки нет (Все метки)

Необходимо составить описание класса для определения одномерных массивов целых чисел. Границы индексов можно задавать произвольно, т.е. массив не обязательно начинается с нуля.

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

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

класс strtype. перегрузка присваивания и сложения - C++
объясните, пожалуйста, что не так: # include &lt;iostream&gt; using namespace std; class strtype { char *p; int len; ...

Перегрузка операции сложения в классе - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;iomanip&gt; using namespace std; class Project { private: int id; ...

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

Операторы сложения и присваивания - C++
здравствуйте. допустим у меня есть класс A. В этом классе содержатся функции : A operator=(A &amp;ob); friend A operator+(A &amp;ob1, A...

Перегрузка оператора присваивания - C++
Задание простое: по заданному классу составить простую программу с использованием динамической памяти. class Cow { char name; ...

Перегрузка оператора присваивания - C++
При перегрузке оператора присвоения выдает ошибки cpp(58) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider...

3
Fyret
184 / 170 / 13
Регистрация: 30.07.2013
Сообщений: 359
29.09.2013, 13:14 #2
Я не понимаю, зачем нужен mas2. В любом случае, значения ему присваиваются неверные, отсюда и все ошибки.
0
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

При вызове же перегруженных операторов - ошибка
0
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];
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2013, 14:09
Привет! Вот еще темы с ответами:

Перегрузка оператора присваивания - C++
мне надо было реализовать конструкторы, деструктор, оператор присваивания, функции ввода / вывода объектов; кто сможет дописать...

Перегрузка присваивания списка - C++
что в перегрузке не так вот код #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;time.h&gt; using namespace std; class...

Перегрузка оператора присваивания - C++
Вот есть такой класс template&lt;typename TT&gt; class Matrix { public: ...

Перегрузка оператора присваивания - C++
Добрый вечер ! Нужна помощь по небольшому теоретико-практическому вопросу. Опять же вопрос по примеру из книги Шилдта С++ Базовый курс....


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

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

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