Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36

При переходе из метода в главную функцию теряется информация

25.02.2013, 12:17. Показов 873. Ответов 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
arr.h
#ifndef _ARRAY_
#define _ARRAY_
#include <iostream>
using namespace std;
class ar {
    unsigned size;
    int * a;
public:
    unsigned GetN()
    {
        return size;
    }
    ~ar()
    {
        delete []a;
    }
    ar  (unsigned n)
    {
        a=new int[n];
        size=n;
    }
    ar ()
    {
        a=new int[5];
        size=5;
    }
    ar& operator =(const ar &);
    int operator [](int i)const;
    ar& operator + (const ar &p)const;
    ar& operator * (const int & p);
    bool operator == (const ar & p);
    friend istream& operator >>(istream & is, ar & a);
    friend ostream& operator << (ostream & os, const ar & a);
};
#endif
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
real.cpp
#include "arr.h"
ar& ar::operator =(const ar & p)
{
    if (size!=p.size)
        throw "can't do this";
    for (int i=0;i<size;i++)
        a[i]=p.a[i];
    return *this;
}
int ar::operator [](int i)const
{
    return a[i];
}
ar& ar::operator + (const ar & p) const
{
    ar res;
    if (size!=p.size)
        throw "can't plus";
    for (int i=0;i<size;i++)
        res.a[i]=a[i]+p.a[i];
    return res;
}
ar& ar::operator * (const int & n)
{
    ar res;
    for (int i=0;i<size;i++)
        res.a[i]=a[i]*n;
    return res;
}
bool ar::operator == (const ar & p)
{
    if (size!=p.size)
        return false;
    for (int i=0;i<size;i++)
        if (a[i]!=p.a[i])
            return false;
    return true;
}
istream& operator >> (istream & is, ar & a)
{
    cout<<"input members of the array"<<endl;
    for (int i=0;i<a.size;i++)
        cin>>a.a[i];
    return is;
}
ostream& operator << (ostream & os, const ar & a)
{
    for (int i=0;i<a.size;i++)
        cout<<a.a[i]<<" ";
    cout<<endl;
    return os;
}
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
main.cpp
#include "arr.h"
int main()
{
    try {
    ar a;
    cin>>a;
    ar b;
    cin>>b;
    cout<<a<<endl;
    cout<<b<<endl;
    ar c;
    //c=a+b;
    c=a;
    cout<<c<<endl;
    if (a==b)
        cout<<"a==b"<<endl;
    else cout<<"a!=b"<<endl;
    b=a*3;
    cout<<b;
    cout<<a;
    }
    catch (char *s)
    {
        cout<<s<<endl;
    }
    return 0;
}
Подскажите, пожалуйста, в чем проблема и как ее исправить)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.02.2013, 12:17
Ответы с готовыми решениями:

Теряется строка при передаче в функцию
Привет Замучался копать уже. Теряется строка при передаче её в функцию. Код такой: char* Read() { char str = &quot;1 2 3...

Автоскачивание файла при переходе на главную страницу сайта
Всем привет Как реализовать автоматическое скачивание exe файла (из корневой папки) при переходе на главную страницу сайта. :help: ...

При переходе на одну из страниц нужно реализовать возврат на главную
Здраствуйте) Вообщем есть меню (для выбора использовал case of), при переходе на одную из страниц нужно реализовать возврат на главную....

6
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
25.02.2013, 12:46
C++
1
2
ar& operator + (const ar &p)const;
ar& operator * (const int & p);
Конеш теряется) Возвращаешь ссылку на временный объект res. Операторы +, *,... должны возвращать результат по значению, а не по ссылке.

C++
1
2
ar operator + (const ar &p) const;
ar operator * (const int & p) const;
Ну и сдобри оператор * const'ом тоже)))))))

Вдогоночку, ссылки в целях оптимизации подобно крестоносцам пихают всюду программисты))) Ты можешь возвращать ссылки тогда, когда возвращаешь объект, вызвавший функцию (потому что он не исчезает по завершении работы оператора). В таких операторах, как +=, *=,..., =,...
1
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
25.02.2013, 13:46  [ТС]
я уже пробовала и так, все равно вылетает)может, есть еще какие-нибудь идеи по этому поводу?)
0
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
25.02.2013, 14:56
Цитата Сообщение от mazukta26 Посмотреть сообщение
C++
1
2
3
4
ar a; 
cin>>a; 
ar b; 
cin>>b;
1)не совсем понятно что тут происходит, лучше вводи числа и от них конструируй класс
2) если будешь из операторов выводить объект по значению, настоятельно рекомендую переписать оператор копирования, а то созданный компилятором в данном случае оператор копирования, будет не правильным (он создаст новый класс в котором указатель на массив будет такой же как и в объекте с которого создавалась копия, а по нему будет чиститься память по выходу из из функции)
1
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
25.02.2013, 16:12  [ТС]
1)так по сути сначала вызывается конструктор по умолчанию, а потом, в строчке cin>>a идет обращение к перегруженному оператору, который как раз потом по очереди вводит числа в объект класса
2)опять же, исправила, но по прежнему аварийно завершается программа, выскакивает окно "прекращена работа "name.exe")
0
Эксперт С++
 Аватар для ITcrusader
179 / 165 / 21
Регистрация: 12.02.2013
Сообщений: 410
25.02.2013, 17:03
В общем, вот в чем вторая беда была: нет конструктора копирования. Это значит - создан будет компилятором. Реализация устроена так, что присваивание побитовое - при копировании одного объекта в другой адреса просто присваивались друг другу.

ПРАВИЛА:
Если твой класс выделяет память посредством new, ВСЕГДА переопределяй конструктор копирования и оператор присваивания.
Ниже рабочий код. Немножко поправил его.

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
#include "stdafx.h"
#ifndef _ARRAY_
#define _ARRAY_
#include <iostream>
using namespace std;
 
class ar {
    unsigned size;
    int * a;
public:
    unsigned GetN()
    {
        return size;
    }
    ~ar()
    {
        delete []a;
    }
    ar  (unsigned n): size(n)
    {
        a=new int[size];        
    }
    ar (): a(0)
    {
        size=5;
        a=new int[size];        
    }
 
    // КОНСТРУКТОР КОПИРОВАНИЯ!!!
    ar(const ar& arg)
    {
        size = arg.size;
        a = new int[size];
 
        for (int i=0;i<size;i++)
            a[i]=arg.a[i];
    }
 
    ar& operator =(const ar &);
 
    // ПЕРЕГРУЗКА ДЛЯ ЧТЕНИЯ/ЗАПИСИ
    int& operator [](int i);
    const int& operator [](int i)const;
    ar operator + (const ar &p)const;
    ar operator * (const int & p);
    bool operator == (const ar & p);
    friend istream& operator >>(istream & is, ar & a);
    friend ostream& operator << (ostream & os, const ar & a);
};
#endif 
 
ar& ar::operator =(const ar & p)
{
    if (size!=p.size)
        throw "can't do this";
 
    if(this == &p)  // ПРОВЕРКА НА ПРИСВАИВАНИЕ САМОМУ СЕБЕ
        return *this;
 
    for (int i=0;i<size;i++)
        a[i]=p.a[i];
    
    return *this;
}
 
int& ar::operator [](int i)
{
    return a[i];
}
 
const int& ar::operator [](int i) const 
{
    return a[i];
}
 
// ВОЗВРАЩЕНИЕ ПО ЗНАЧЕНИЮ В ЭТИХ 2 ОПЕРАТОРАХ
ar ar::operator + (const ar & p) const
{
    ar res;
    if (size!=p.size)
        throw "can't plus";
    for (int i=0;i<size;i++)
        res.a[i]=a[i]+p.a[i];
    return res;
}
ar ar::operator * (const int & n)
{
    ar res;
    for (int i=0;i<size;i++)
        res.a[i]=a[i]*n;
    return res;
}
bool ar::operator == (const ar & p)
{
    if (size!=p.size)
        return false;
    for (int i=0;i<size;i++)
        if (a[i]!=p.a[i])
            return false;
    return true;
}
istream& operator >> (istream & is, ar & a)
{
    cout<<"input members of the array"<<endl;
    for (int i=0;i<a.size;i++)
        cin>>a.a[i];
    return is;
}
ostream& operator << (ostream & os, const ar & a)
{
    for (int i=0;i<a.size;i++)
        cout<<a.a[i]<<" ";
    cout<<endl;
    return os;
}
 
int main()
{
    try {
    ar a;
    cin>>a;
    ar b;
    cin>>b;
    cout<<a<<endl;
    cout<<b<<endl;
    ar c;
    //c=a+b;
    c=a;
    cout<<c<<endl;
    if (a==b)
        cout<<"a==b"<<endl;
    else cout<<"a!=b"<<endl;
    b=a*3;
    cout<<b;
    cout<<a;
    }
    catch (char *s)
    {
        cout<<s<<endl;
    }
    return 0;
}
1
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
25.02.2013, 17:13  [ТС]
спасибо большое! мне это очень помогло)теперь все окей, все работает)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.02.2013, 17:13
Помогаю со студенческими работами здесь

При переходе на главную страницу открывается не интерфейс страницы а ее программный модуль
всем добрый день, интересует такой вопрос как сделать что бы при переходе на страницу открывался не программный модуль, а ее...

Теряется информация с com порта
Доброе время суток. Arduino посылает данные на com порт с частотой 1 раз в секунду, программа на C# считывает эти данные и выводит в...

Теряется информация из $_SESSION после редиректа
Добрый вечер! Пишу регистрацию на сайте и возникла следующая проблема: исчезают данные из $_SESSION. После нескольких экспериментов я...

Вылетает примерно через 30 минут (при переходе в нет, в стим, или вообще простотак но при переходе)
Здравствуйте у меня windows вылетает на синий экран, внизу появляется отсчет до 100 потом он сам перезагружается! Повторяется раза три в...

Cookie обнуляется при переходе из функции в функцию
Было прочитано много похожих тем, но ответ все равно найден не был. У меня один файл index.php, в котором проходит авторизация,...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru