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

Перезагрузка operator - - C++

Восстановить пароль Регистрация
 
Lotys
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
24.05.2011, 03:09     Перезагрузка operator - #1
Есть одна задача :
Одномерный массив а и b. Класс одномерный массив. Реализовать для объектов данного класса перезагрузку операции - (c=a-b)
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <iostream.h>
#include <assert.h>
#include <conio.h>
 
class Vector
{
    friend ostream& operator << (ostream &, const Vector &);
public:
    Vector ();
    Vector (int);
    Vector (const Vector & );
    ~Vector();
    int &operator[](int);
    Vector &operator - ( const Vector &);
    Vector &operator = (const Vector &);
    const int Getsize();
    
private:
    int *ptr;
    int size;
 
};
//конструктор по умолчанию
Vector::Vector()
{
    size=0;
    ptr= new int[size];
    for (int i=0;i<=size;++i)
    {
        ptr[i]=0;
    }
}
//конструктор с параметрами
Vector::Vector(int newSize)
{
    if (0<=newSize)
        size=newSize;
    else cout<< "Size error" << newSize<<endl;
 
    ptr= new int[size];
    assert(ptr != 0);
    for (int i=0;i<size;i++)
    {
        ptr[i]=0;
    }
}
//конструктор копирования
Vector::Vector(const Vector &init)
{
    size=init.size;
    ptr=new int[size];
    assert(ptr!=0);
    for (int i=0;i<size;i++)
    {
        ptr[i]=init.ptr[i];
    }
}
//деструктор
Vector::~Vector()
{
    cout<<"Goodby Vectorcheg!"<<endl;
    delete [] ptr;
}
//перезагрузка операции индексации
int &Vector::operator [](int subscript)
{
    assert(0<=subscript && subscript<size);
    return ptr[subscript];
}
//перезагрузка операции унарного "-"
Vector& Vector::operator - ( const Vector &rigth)
{
    Vector Temp(size);
    int temp1=0;
    int temp2=0;
    
 
    for (int i=0; i<size; i++)
    {
        temp1=rigth.ptr[i];
        temp2=ptr[i];
        Temp[i]=temp1-temp2;
    }
    return Temp;
 
 
 
}
 
//перезагрузка операции пристваивания
Vector& Vector::operator =(const Vector &rigth)
{
    int temp=0;
    for (int i=0; i<size; i++)
    {
        temp=ptr[i];
        rigth.ptr[i]=temp;
    
    }
    return *this;
}
 
 
//определение размера массива
const int Vector::Getsize()
{
    return size;
}
 
 
//вывод объекта поток ostream
ostream& operator << (ostream & outStream,const Vector & outVector)
{
    if (outVector.size)
    {
        for (int i=0; i< outVector.size;i++)
            outStream<<"["<<outVector.ptr[i]<<"]";
    }
    else outStream<< "Vector zero size!...";
    return outStream;
}
 
 
       
 
 
 
int main ()
{
    int size;
    cout<<"input a[]"<<endl;
    cout<< "size a[]"; 
    cin>>size;
    Vector a(size);
    
    for (int i=0;i<a.Getsize();i++)
    {
        cout<<i<<":";
        cin>> a[i];
    }
    cout<<"input b[]"<<endl;
    cout<< "size b[]"; 
 
    Vector b(size);
    Vector c(size);
    for (int j=0;j<b.Getsize();j++)
    {
        cout<<j<<":";
        cin>> b[j];
    }
 
    cout<<"Vector a"<<a<<endl;
    cout<<"Vector b"<<b<<endl;
    cout<<"Vector c"<<c<<endl;
    c=a-b;
    cout<<"Vector a"<<a<<endl;
    cout<<"Vector b"<<b<<endl;
    cout<<"Vector c"<<c<<endl;
 
 
    _getch();
 
 
 
 
 
    return 0;
 
}
Но вот с перезагрузкой - ну не как не выходит.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.05.2011, 03:09     Перезагрузка operator -
Посмотрите здесь:

C++ operator[]
Перезагрузка operator == C++
перезагрузка operator + C++
operator char() или operator int() C++
Перезагрузка операторов "неоднозначный operator" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.05.2011, 07:45     Перезагрузка operator - #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Vector& Vector::operator - ( const Vector &rigth)
{
        Vector Temp(size);
        int temp1=0;
        int temp2=0;
        
 
        for (int i=0; i<size; i++)
        {
                temp1=rigth.ptr[i];
                temp2=ptr[i];
                Temp[i]=temp1-temp2;
        }
        return Temp;
 
 
 
}
у тебя функция возвращает Temp, для которого вызывается деструктор который уничтожает его, поэтому ссылка недействительна! Надо хотя бы так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Vector& Vector::operator - ( const Vector &rigth)
{
        Vector *Temp = new Vector(size);
        int temp1=0;
        int temp2=0;
        
 
        for (int i=0; i<size; i++)
        {
                temp1=rigth.ptr[i];
                temp2=ptr[i];
                (*Temp)[i]=temp1-temp2;
        }
        return *Temp;
 
 
 
}
далее опереатор присвоения какой-то странный, непонятно чё он делает. Помоему так надо, и ещё я бы this->size = right.size добавил, но у тебя там какая-то жёсткая схема и так будет работать
C++
1
2
3
4
5
6
7
8
bool Vector::operator =(const Vector &rigth)
{
        for (int i=0; i<size; i++)
        {
                ptr[i] = rigth.ptr[i];
        }
        return true;
}
после этих исправлений прога перестала вылетать

комментарии тоже странные
Цитата Сообщение от Lotys Посмотреть сообщение
//перезагрузка операции унарного "-"
один аргумент типа this, или как там правильно сказать, а второй который ты передаёшь в функцию.
Унарный это такая штука
C++
1
bool operator-();
его допиши и будет у тебя перегруженный оператор

ещё мне кажется что это штука накроется медным тазом при size = 1
C++
1
2
3
4
5
Vector::~Vector()
{
        cout<<"Goodby Vectorcheg!"<<endl;
        delete [] ptr;
}
ну и какие-то косяки при вводе векторов, я не разобрался, а может так и должно быть...

Добавлено через 3 минуты
или убери значёк &, означающий передачу по ссылке в operator-(const Vector&), так как у тебя есть конструктор копирования, он скопирует твой Temp, но по ссылке не передавай, она недействительна
yekka
384 / 148 / 8
Регистрация: 12.05.2011
Сообщений: 450
24.05.2011, 10:45     Перезагрузка operator - #3
operator-
и
operator=
пишутся без пробелов
=))
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.05.2011, 12:39     Перезагрузка operator - #4
Цитата Сообщение от yekka Посмотреть сообщение
operator-
и
operator=
пишутся без пробелов
Да хоть через два пробела, табулятор и перевод строки.

Цитата Сообщение от pito211 Посмотреть сообщение
return *Temp;
Жжошь!

Цитата Сообщение от pito211 Посмотреть сообщение
или убери значёк &
Нет, не убирай.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.05.2011, 13:17     Перезагрузка operator - #5
Цитата Сообщение от Deviaphan Посмотреть сообщение
Сообщение от pito211
return *Temp;
Жжошь!
Сообщение от pito211
или убери значёк &
Нет, не убирай.
а чё не так?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.05.2011, 13:20     Перезагрузка operator - #6
return *Temp; -> return Temp; но по значению. Возвращать ссылку на динамически выделенный объект это жжесть!
Нет, не убирай. - Передавать константный объект по значению это тоже жжесть!
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.05.2011, 13:28     Перезагрузка operator - #7
если оставить так как есть, программа не работает, потому что сразу после ретурна вызывается деструктор для темп и ссылка становится бессмысленной. Если убрать & в Vector& вызовется конструктор копирования и всё будет ок. Если надо оставить обязательно Vector& то нужно самому контролировать время жизни объекта разместив его в куче, но тогда память утекёт
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.05.2011, 13:37     Перезагрузка operator - #8
pito211, return *this ничего не говорит? м?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.05.2011, 13:40     Перезагрузка operator - #9
Я думал, ты про ссылку в параметре написал, т.к. возвращаемый тип не указал.) Раз ты про возвращаемый тип, то замечание считается недействительным.)

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
pito211, return *this ничего не говорит? м?
Речь не о невозможности возврата ссылки на динамический объект, а про
C++
1
2
3
4
5
int & f()
{
    int * i = new int;
    return *i;
}
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.05.2011, 13:43     Перезагрузка operator - #10
Цитата Сообщение от ForEveR Посмотреть сообщение
pito211, return *this ничего не говорит? м?
не очень понял если честно, я ведь сам только начал изучать щи. Можно целиком operator- увидеть с return *this? Заранее спасибо
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
24.05.2011, 13:55     Перезагрузка operator - #11
С this то без проблем) Вопрос в том нужно-ли это. Скорее все же нет) Посему.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Vector& Vector::operator -= ( const Vector &rigth)
{
        for (int i=0; i<size; i++)
        {
                ptr[i]=right.ptr[i]-ptr[i];
        }
        return *this;
}
 
Vector Vector::operator - (const Vector& right)
{
     Vector new_vec(*this);
     new_vec -= right;
     return new_vec;
}
Lotys
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
26.05.2011, 02:08  [ТС]     Перезагрузка operator - #12
Всем спасибо.. я в принципе это дело реализовал так:
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <iostream.h>
#include <assert.h>
#include <conio.h>
 
class Vector
{
        friend ostream& operator << (ostream &, const Vector &);
public:
        Vector ();
        Vector (int);
        Vector (const Vector & );
        ~Vector();
        int &operator[](int);
        Vector &operator - ( const Vector &);
        Vector &operator = (const Vector &);
        const int Getsize();
        
private:
        int *ptr;
        int size;
 
};
//конструктор по умолчанию
Vector::Vector()
{
        size=0;
        ptr= new int[size];
        for (int i=0;i<=size;++i)
        {
                ptr[i]=0;
        }
}
//конструктор с параметрами
Vector::Vector(int newSize)
{
        if (0<=newSize)
                size=newSize;
        else cout<< "Size error" << newSize<<endl;
 
        ptr= new int[size];
        assert(ptr != 0);
        //for (int i=0;i<size;i++)
        //{
        //        ptr[i]=0;
        //}
}
//конструктор копирования
Vector::Vector(const Vector &init)
{
        size=init.size;
        ptr=new int[size];
        assert(ptr!=0);
        for (int i=0;i<size;i++)
        {
                ptr[i]=init.ptr[i];
        }
}
//деструктор
Vector::~Vector()
{
        cout<<"Goodby Vectorcheg!"<<endl;
        delete [] ptr;
}
//перезагрузка операции индексации
int &Vector::operator [](int subscript)
{
        assert(0<=subscript && subscript<size);
        return ptr[subscript];
}
//перезагрузка операции  "-"
Vector & Vector::operator - ( const Vector &rigth)
{
        Vector *Temp = new Vector(size);
        int temp1=0;
        int temp2=0;
        
 
        for (int i=0; i<size; i++)
        {
                temp1=ptr[i];
                temp2=rigth.ptr[i];
                (*Temp)[i]=temp1-temp2;
        }
        return *Temp;
  
}
 
 
//перезагрузка операции пристваивания
Vector& Vector::operator =(const Vector &rigth)
{
        int temp=0;
        for (int i=0; i<size; i++)
        {
                
                temp=rigth.ptr[i];
                ptr[i]=temp;
        
        }
        return *this;
}
 
 
//определение размера массива
const int Vector::Getsize()
{
        return size;
}
 
 
//вывод объекта поток ostream
ostream& operator << (ostream & outStream,const Vector & outVector)
{
        if (outVector.size)
        {
                for (int i=0; i< outVector.size;i++)
                        outStream<<"["<<outVector.ptr[i]<<"]";
        }
        else outStream<< "Vector zero size!...";
        return outStream;
}
 
 
           
 
 
 
int main ()
{
        int size;
        cout<<"input a[]"<<endl;
        cout<< "size a[]"; 
        cin>>size;
        Vector a(size);
        
        for (int i=0;i<a.Getsize();i++)
        {
                cout<<i<<":";
                cin>> a[i];
        }
        cout<<"input b[]"<<endl;
        cout<< "size b[]"; 
 
        Vector b(size);
        Vector c(size);
        for (int j=0;j<b.Getsize();j++)
        {
                cout<<j<<":";
                cin>> b[j];
        }
 
        cout<<"Vector a"<<a<<endl;
        cout<<"Vector b"<<b<<endl;
       
        c=a-b;
        cout<<"Vector a"<<a<<endl;
        cout<<"Vector b"<<b<<endl;
        cout<<"Vector c"<<c<<endl;
 
 
        _getch();
 
 
 
 
 
        return 0;
 
}
Пусть немного коряво но вполне работает...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 05:56     Перезагрузка operator -
Еще ссылки по теме:

C++ Expected init-declarator before "operator".expected `,' or `;' before "operator"
Operator = C++
Реализация operator + через operator += C++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.05.2011, 05:56     Перезагрузка operator - #13
Цитата Сообщение от Lotys Посмотреть сообщение
Пусть немного коряво
Отсутствие освобождения ресурсов не есть коряво, это есть Уж0с!
Вот потому я и написал, что возвращать ссылку на объект в динамической памяти - плохо. Ты же махом забыл о необходимости удалить его. И не удалил. А потом удивляются, куда ресурсы деваются?..
Yandex
Объявления
26.05.2011, 05:56     Перезагрузка operator -
Ответ Создать тему
Опции темы

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