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

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

Войти
Регистрация
Восстановить пароль
 
Lagos
7 / 7 / 0
Регистрация: 19.01.2012
Сообщений: 189
Записей в блоге: 2
Завершенные тесты: 2
#1

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

26.02.2017, 19:47. Просмотров 355. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Перегрузка операции [] (C++):

Перегрузка операции - C++
Здравствуйте! Нужно перегрузить операцию &lt;&lt; для вставки полей объекта класса в файл. Есть класс Hostel c полями FIO, GroupNumber и...

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

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

Перегрузка операции >> - C++
Вообщем хочу перегрузить операцию &gt;&gt; и инициализировать с ее помощью класс. Но что-то перемудрил и компилятор ругается на эту функцию: ...

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

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

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

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

Добавлено через 8 минут
И исключение не там обрабатываешь, при такой обработке всё-равно вылазишь за границу выделенной памяти. В main() обрабатывай.
1
Lagos
7 / 7 / 0
Регистрация: 19.01.2012
Сообщений: 189
Записей в блоге: 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
Привет! Вот еще темы с ответами:

Перегрузка операции ~ - C++
Задача: Перегрузить операцию ~ (унарная операция) так, чтобы она изменяла знак закрытых элементов – данных на противоположный для класса,...

Перегрузка операции - C++
Всем привет! Помогите сделать пожалуйста задание, а то совсем я не понимаю его :-| Перегрузите операции суммы, скалярного...

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

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


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

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

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