Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Lagos
7 / 7 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 2
Завершенные тесты: 2
#1

Перегрузка операции []

26.02.2017, 19:47. Просмотров 370. Ответов 6
Метки нет (Все метки)

Добрый день. Столкнулся с недопониманием, странной ошибкой.
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
#include <iostream>
#include "windows.h"
 
class Array
{
    int *mass;
    int size;
public:
    ........
    int& operator[](int);
        ..........
};
 
int& Array::operator[](int index)
{
    if (index < 0 || index > this->size - 1)
    {
        cout << "\nЗафиксирована попытка выхода за границу массива. Остановка операции.";
        int ret(0); return ret;
    }
    return *(this->mass + index);
}
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Array arr1(10);
    arr1.add();
    for (int i(0); i < 10; i++)
        cout << arr1[i]<<" ";
    cout << endl;
 
        return 0;
}
Программа ловит ошибку в этой строке:
C++
1
cout << arr1[i]<<" ";
Но ловит её только под отладкой. И отладить становится невозможно. Без отладки программа выводит числа, но если индекс попадает за границы массива, то происходит единственный вывод сообщения
C++
1
cout << "\nЗафиксирована попытка выхода за границу массива. Остановка операции.";
После этого программа останавливается. Прошу разъяснить мою ошибку. Заранее спасибо.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2017, 19:47
Ответы с готовыми решениями:

Перегрузка операции %
Как перегрузить операцию % в с++?

Перегрузка операции
Здравствуйте, можете пожалуйста помочь с кодом на перегрузку операции: + −...

Перегрузка операции
Никак не могу понять как перегрузить оператор. Кучу примеров пересмотрел, но...

Перегрузка операции >>
Всем привет! Суть: есть класс, есть объект, есть перегруженная операция &gt;&gt; для...

Перегрузка операции
Здравствуйте! Нужно перегрузить операцию &lt;&lt; для вставки полей объекта класса в...

6
GbaLog-
Любитель чаепитий
3160 / 1466 / 462
Регистрация: 24.08.2014
Сообщений: 5,190
Записей в блоге: 1
Завершенные тесты: 2
26.02.2017, 20:01 #2
Возврат ссылки на временный объект. По выходу из operator[] int ret уже не будет существовать, тем не менее вы пытаетесь вывести то, что на что ссылается возвращаемая ссылка.

Добавлено через 6 минут
Неплохо было бы ещё на функцию add поглядеть.
0
Lagos
7 / 7 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 2
Завершенные тесты: 2
26.02.2017, 20:27  [ТС] #3
GbaLog
Обычное заполнение массива . Вот:
C++
1
2
3
4
5
void Array::add()
{
    for (int i(0); i < this->size; i++)
        *(mass + i) = rand() % 150;
}
Кажется, понял. Действительно, ret ведь локальна..

Добавлено через 2 минуты
Тогда вопрос более глобален. Как прервать функцию? Ибо мне возвращать ничего не нужно..
Думал над этим очень долго, пока мыслей нет.
0
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
26.02.2017, 20:38 #4
Цитата Сообщение от Lagos Посмотреть сообщение
Ибо мне возвращать ничего не нужно..
Если бы...
Цитата Сообщение от Lagos Посмотреть сообщение
Как прервать функцию?
Вбрасывай исключение.
http://ru.cppreference.com/w/cpp/container/array/at
1
Lagos
7 / 7 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 2
Завершенные тесты: 2
26.02.2017, 21:06  [ТС] #5
Даже если я сгенерирую исключение, всё равно под отладкой вылезает абсолютно непонятная мне ошибка. Вот полный код, если кому не сложно, запустите его под отладкой, будет у Вас ошибаться или нет:

Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include <ctime>
 
using namespace std;
 
class Array
{
    int *mass;
    int size;
public:
    Array() :size(0), mass(nullptr) {};
    Array(int s) : size(s), mass(mass = new int[this->size]) {};
    Array(const Array&);
    Array& operator=(const Array&);
    void add();
    int& operator[](int);
 
    ~Array()
    {
        delete[] this->mass;
        this->mass = nullptr;
    }
};
 
Array::Array(const Array& a)
{
    for (int i(0); i < this->size && i < a.size; i++)
    {
        if (i > a.size - 1)
            *(this->mass + i) = 0;
        else
            *(this->mass + i) = *(a.mass + i);
    }
}
 
Array& Array::operator=(const Array& a)
{
    if (this == &a)
        return *this;
    for (int i(0); i < this->size && i < a.size; i++)
        if (i > a.size - 1)
            *(this->mass + i) = 0;
        else
            *(this->mass + i) = *(a.mass + i);
    return *this;
}
 
void Array::add()
{
    for (int i(0); i < this->size; i++)
        *(mass + i) = rand() % 150;
}
 
int& Array::operator[](int index)
{
    try
    {
        if (index < 0 || index > this->size - 1)
            throw 1;
        return *(this->mass + index);
    }
    catch (int i)
    {
        cout << "\nЗафиксирована попытка выхода за границу массива. Остановка операции.";
    }
}
 
 
int main()
{
    srand(time(0));
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    Array arr1(10);
    arr1.add();
    for (int i(0); i < 10; i++)
        cout << arr1[i] << " ";
    cout << endl;
 
    Array arr2(5);
    arr2 = arr1;
    for (int i(0); i < 10; i++)
        cout << arr2[i]<< " ";
    cout << endl;
 
        return 0;
}
0
nd2
2828 / 2398 / 1054
Регистрация: 29.01.2016
Сообщений: 8,022
26.02.2017, 21:25 #6
Для начала, переставь местами поля size и mass в классе.

Добавлено через 8 минут
И исключение не там обрабатываешь, при такой обработке всё-равно вылазишь за границу выделенной памяти. В main() обрабатывай.
1
Lagos
7 / 7 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 2
Завершенные тесты: 2
26.02.2017, 21:35  [ТС] #7
Я дико извиняюсь..
Я серьёзно не заметил.(про члены класса)
Исправил всё. Большое спасибо.
0
26.02.2017, 21:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2017, 21:35

Перегрузка операции =
Здравствуйте, в программе вылезает такая ошибка MainUnit.cpp(86): E2034...

Перегрузка операции
Как реализовать код ? &quot;Определить операции над строками :Вставка символа на...

Перегрузка операции =
Подскажите пожалуйста как для шаблонной функции перегрузить = есть не сложно то...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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