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

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

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

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

25.02.2013, 12:17. Просмотров 348. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.02.2013, 12:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При переходе из метода в главную функцию теряется информация (C++):

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

Программа виснет при переходе в функцию function - C++
#include &lt;iostream&gt; using namespace std; void function(char * string) { while(*string) { cout&lt;&lt;*string; ...

Как из рекурсии перейти в main (главную функцию) - C++
Допустим мне необходимо выполнение рекурсии до какого-то условия, условие выполнилось, а рекрсии продолжили выполняться, как избавиться от...

Теряется точность при вычислении с double - C++
Доброго времени суток. В процессе решения кубического уравнения, у меня теряется точность переменной типа double. Пробовал использовать...

Теряется часть информации при выводе в консоль - C++
Я пишу игру Пьяницы, и в цикле происходит вывод информации о номинале карты, сравнении этой карты с другой и т.д. Так получается, что...

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

6
ITcrusader
Эксперт С++
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'ом тоже)))))))

Вдогоночку, ссылки в целях оптимизации подобно крестоносцам пихают всюду программисты))) Ты можешь возвращать ссылки тогда, когда возвращаешь объект, вызвавший функцию (потому что он не исчезает по завершении работы оператора). В таких операторах, как +=, *=,..., =,...
1
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
25.02.2013, 13:46  [ТС] #3
я уже пробовала и так, все равно вылетает)может, есть еще какие-нибудь идеи по этому поводу?)
0
aLarman
642 / 563 / 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) если будешь из операторов выводить объект по значению, настоятельно рекомендую переписать оператор копирования, а то созданный компилятором в данном случае оператор копирования, будет не правильным (он создаст новый класс в котором указатель на массив будет такой же как и в объекте с которого создавалась копия, а по нему будет чиститься память по выходу из из функции)
1
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
25.02.2013, 16:12  [ТС] #5
1)так по сути сначала вызывается конструктор по умолчанию, а потом, в строчке cin>>a идет обращение к перегруженному оператору, который как раз потом по очереди вводит числа в объект класса
2)опять же, исправила, но по прежнему аварийно завершается программа, выскакивает окно "прекращена работа "name.exe")
0
ITcrusader
Эксперт С++
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;
}
1
mazukta26
1 / 1 / 0
Регистрация: 25.02.2013
Сообщений: 36
25.02.2013, 17:13  [ТС] #7
спасибо большое! мне это очень помогло)теперь все окей, все работает)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 17:13
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Yandex
Объявления
25.02.2013, 17:13
Ответ Создать тему
Опции темы

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