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

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

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

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

24.05.2011, 03:09. Просмотров 839. Ответов 12
Метки нет (Все метки)

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

перезагрузка operator + - C++
есть самописный класс String; в нем определены операторы + для, String + String String + char String + *char для вывода в поток и...

Перезагрузка operator == - C++
Тренируюсь и пишу клас комплексных чисел. Проблема с перезагнрузкой оператора сравнения да и другие перезагрузки не хотят использоваться....

Перезагрузка операторов "неоднозначный operator" - C++
Не знаю в ту ли группу пишу, но все же.... Для моего класса есть несколько операторов присвоения const MyStr&amp; operator +=(const MyStr&amp;...

Class & operator's |Error: undefined reference to operator - C++
Компилирует нормально, но когда хочу использовать оператор выдает ошибку:undefined reference to 'operator..(Fraction const&amp;, Fraction...

operator char() или operator int() - C++
Здорова госпдо! Снова ничо не ясно как всегда. Разбираю программку из книги Страуструпа, там он описывает класс String в нем есть ...

Вызов operator[] через operator[] const - C++
Перелистывал Майерса, наткнулся на код, подскажите пожалуйста почему он советует закомментированный вариант кода, не проще сделать как...

12
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.05.2011, 07:45 #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, но по ссылке не передавай, она недействительна
0
yekka
386 / 150 / 8
Регистрация: 12.05.2011
Сообщений: 450
24.05.2011, 10:45 #3
operator-
и
operator=
пишутся без пробелов
=))
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
24.05.2011, 12:39 #4
Цитата Сообщение от yekka Посмотреть сообщение
operator-
и
operator=
пишутся без пробелов
Да хоть через два пробела, табулятор и перевод строки.

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

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

Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
pito211, return *this ничего не говорит? м?
Речь не о невозможности возврата ссылки на динамический объект, а про
C++
1
2
3
4
5
int & f()
{
    int * i = new int;
    return *i;
}
0
pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
24.05.2011, 13:43 #10
Цитата Сообщение от ForEveR Посмотреть сообщение
pito211, return *this ничего не говорит? м?
не очень понял если честно, я ведь сам только начал изучать щи. Можно целиком operator- увидеть с return *this? Заранее спасибо
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
24.05.2011, 13:55 #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;
}
2
Lotys
0 / 0 / 0
Регистрация: 11.05.2011
Сообщений: 3
26.05.2011, 02:08  [ТС] #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;
 
}
Пусть немного коряво но вполне работает...
0
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1306 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
26.05.2011, 05:56 #13
Цитата Сообщение от Lotys Посмотреть сообщение
Пусть немного коряво
Отсутствие освобождения ресурсов не есть коряво, это есть Уж0с!
Вот потому я и написал, что возвращать ссылку на объект в динамической памяти - плохо. Ты же махом забыл о необходимости удалить его. И не удалил. А потом удивляются, куда ресурсы деваются?..
0
26.05.2011, 05:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 05:56
Привет! Вот еще темы с ответами:

Реализация operator + через operator += - C++
внутри следующей темы возник вопрос, ответ на который так и не был получен: ...

Перегрузить операторы operator+() и operator*() в пользовательском классе "Комплексное число" - C++
Здравствуйте. Предлагаю заняться арифметикой. Создал прослейший класс, перегрузил операторы сложения и умножения, в конструкторе...

Operator +, operator += — какой через какой реализовывать? - C++
Для class Fraction { // ... public: Fraction operator + ( const Fraction&amp; right ) const; Fraction&amp; operator += ( const...

Чем "operator *=" отличается от "operator *"? - C++
снова застряла, не могу понять, чем этот оператор должен отличаться от оператора*.....? вот он, но это работает только в случае...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

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