Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
#1

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

25.02.2013, 12:17. Просмотров 337. Ответов 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;
}
Подскажите, пожалуйста, в чем проблема и как ее исправить)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 12:17     При переходе из метода в главную функцию теряется информация
Посмотрите здесь:

Создать функцию нахождения минимального элемента квадратной матрицы и сортировать её главную диагональ. C++
C++ Написать главную функцию программы, в которой бы вводилась простая матрица и выводилась обратная ей
Программа виснет при переходе в функцию function C++
C++ Передать указатель метода в функцию С++
C++ Написать функцию, которая определяет, есть ли в файле информация
Теряется строка при передаче в функцию C++
При передаче указателя в качестве аргумента функции теряется значение C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
25.02.2013, 12:46     При переходе из метода в главную функцию теряется информация #2
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'ом тоже)))))))

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

ПРАВИЛА:
Если твой класс выделяет память посредством 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 17:13     При переходе из метода в главную функцию теряется информация
Еще ссылки по теме:

C++ Как из рекурсии перейти в main (главную функцию)
C++ Теряется часть информации при выводе в консоль
Сбиваются указатели при переходе между функциями C++
При переводе string в long double теряется дробная часть C++
Теряется точность при вычислении с double C++

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

Или воспользуйтесь поиском по форуму:
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
25.02.2013, 17:13  [ТС]     При переходе из метода в главную функцию теряется информация #7
спасибо большое! мне это очень помогло)теперь все окей, все работает)
Yandex
Объявления
25.02.2013, 17:13     При переходе из метода в главную функцию теряется информация
Ответ Создать тему
Опции темы

Текущее время: 14:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru