Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
11 / 11 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 2
1

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

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

Author24 — интернет-сервис помощи студентам
Добрый день. Столкнулся с недопониманием, странной ошибкой.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.02.2017, 19:47
Ответы с готовыми решениями:

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

Перегрузка операции >>
Добрый день! Решил сделать класс с перегруженными операциями ввода и вывода, с выводом все в...

Перегрузка операции >>
Здравствуйте. Возник такой вопрос: возможни ли перегрузить оператор &gt;&gt; так, чтобы пользователь мог...

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

6
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
26.02.2017, 20:01 2
Возврат ссылки на временный объект. По выходу из operator[] int ret уже не будет существовать, тем не менее вы пытаетесь вывести то, что на что ссылается возвращаемая ссылка.

Добавлено через 6 минут
Неплохо было бы ещё на функцию add поглядеть.
0
11 / 11 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 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
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.02.2017, 20:38 4
Цитата Сообщение от Lagos Посмотреть сообщение
Ибо мне возвращать ничего не нужно..
Если бы...
Цитата Сообщение от Lagos Посмотреть сообщение
Как прервать функцию?
Вбрасывай исключение.
http://ru.cppreference.com/w/c... r/array/at
1
11 / 11 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 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
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
26.02.2017, 21:25 6
Для начала, переставь местами поля size и mass в классе.

Добавлено через 8 минут
И исключение не там обрабатываешь, при такой обработке всё-равно вылазишь за границу выделенной памяти. В main() обрабатывай.
1
11 / 11 / 6
Регистрация: 19.01.2012
Сообщений: 195
Записей в блоге: 2
26.02.2017, 21:35  [ТС] 7
Я дико извиняюсь..
Я серьёзно не заметил.(про члены класса)
Исправил всё. Большое спасибо.
0
26.02.2017, 21:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2017, 21:35
Помогаю со студенческими работами здесь

Перегрузка операции
Добрый день, Друзья! Столкнулся с такой проблемой, необходимо сравнить 2 пары чисел, вводимых с...

Перегрузка операции
Запрограммировать и протестировать заданную перегруженную операцию, содержащуюся в классе,...

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

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

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

Перегрузка операции +
Всем привет! Ребята, обясните, пжлста, почему конструктор вызывается дважды. Rational integer1(...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru