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

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

26.02.2017, 19:47. Показов 617. Ответов 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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2017, 19:47
Ответы с готовыми решениями:

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

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

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

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

6
Любитель чаепитий
3744 / 1800 / 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
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
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
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
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
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.02.2017, 21:35
Помогаю со студенческими работами здесь

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

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на C# с Kafka, MediatR, Redis и GitLab CI/CD
InfoMaster 15.01.2025
В современной разработке программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот подход позволяет разделить сложную систему. . .
Что такое CQRS и как это реализовать на C# с MediatR
InfoMaster 15.01.2025
Концепция CQRS и её роль в современной разработке В современном мире разработки программного обеспечения архитектурные паттерны играют ключевую роль в создании масштабируемых и поддерживаемых. . .
Как настроить CI/CD с Azure DevOps
InfoMaster 15.01.2025
CI/ CD, или непрерывная интеграция и непрерывное развертывание, представляет собой современный подход к разработке программного обеспечения, который позволяет автоматизировать и оптимизировать процесс. . .
Как настроить CI/CD с помощью Jenkins
InfoMaster 15.01.2025
Введение в CI/ CD и Jenkins В современной разработке программного обеспечения непрерывная интеграция (CI) и непрерывная доставка (CD) стали неотъемлемыми элементами процесса создания качественных. . .
Как написать микросервис на Go/Golang с Kafka, REST и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS, Swagger и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru