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

Перегрузка операторов - C++

Восстановить пароль Регистрация
 
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
10.11.2012, 17:05     Перегрузка операторов #1
Помогите разобраться в перегрузке операторов. Нужно создать клас Автомобиль в котором определить поля скорость и стоимость и методы доступа к этим полям. Перегрузить оператор "+" и "-", которые будут увеличивать или уменьшать цену автомобиля. Перегрузить оператор присвоения. Не могу понять как работает перегрузка операторов и зачем она нужна. Вот класс:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;
 
class Avto
{
    int Speed, Cost;
public:
    mSpeed(int aSpeed) {Speed=aSpeed;}
    mCost(int aCost) {Cost=aCost;}
    Avto operator +(Avto obj);
    Avto operator -(Avto obj);
};
Не знаю что делать дальше, подскажите.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2012, 17:05     Перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
Перегрузка операторов C++
Перегрузка операторов С++ C++
C++ перегрузка операторов
C++ Перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 17:24     Перегрузка операторов #2
Перегрузка состоит из: компилятор идет по коду (с начала в main), увидел выражение, например, тот же "+" (вернее, с тем же "плюсом"). Смотрит, знает ли он типы, над которыми совершается операция (стандартные типа int, float и т.д.). Если, как в данном случае типы ему неизвестны (мы складываем объект с объектом), он ищет перегруженную функцию этого оператора (ее мы реализуем отдельно), а после уже выполняет тот участок кода, который содержится в той самой функции.
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
#include <iostream>
using namespace std;
 
class Avto
{
    int Speed, Cost;
public:
   
    Avto(int);
    Avto operator +(Avto obj);
    Avto operator -(Avto obj);
    Avto operator =(Avto obj);
    void print();
};
 
Avto::Avto(int c)
{
     Speed=0;
     Cost=c;
}
 
Avto Avto::operator + (Avto obj)
{
     return Avto(this->Cost+obj.Cost);
} 
 
Avto Avto::operator = (Avto obj)
{
     return Avto(this->Cost=obj.Cost);
} 
     
void Avto::print()
{
     cout<<Cost<<endl;
}  
int main()
{
 Avto carCost=400,carCost1=200,carCost2=300;
 carCost2=carCost+carCost1;
 carCost2.print();
 system("pause");
 return 0;
}
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
10.11.2012, 17:53  [ТС]     Перегрузка операторов #3
BumerangSP, спасибо, буду разбираться. Правда компилятор ругается на system("pause");
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 18:17     Перегрузка операторов #4
Leew,
C++
1
#include <windows.h>
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
10.11.2012, 18:20     Перегрузка операторов #5
BumerangSP, <cstdlib> думаю лучше.
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
10.11.2012, 18:46  [ТС]     Перегрузка операторов #6
BumerangSP, пишет "sh: pause: command not found". И еще одно. А как теперь перегрузить операторы "++", "--" что б они увеличивали или уменьшали скорость на 1. И операторы "+=", "-=" чтоб они отнимали и добавляли пробег. Там теперь ненужен объект как параметр?
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 19:20     Перегрузка операторов #7
Toshkarik, мда, точно. Просто для этой команды ни разу не подключал библиотек
Хотя, я думал, что cstdlib итак должен подключаться. Видимо, не везде.

Добавлено через 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
37
#include <iostream>
using namespace std;
 
class Avto
{
    int Speed, Cost;
public:
   
    Avto(int);
    Avto operator ++(int);
    void print();
};
 
Avto::Avto(int c)
{
     Speed=0;
     Cost=c;
}
 
Avto Avto::operator ++ (int)
{
     return Avto(this->Cost++);
} 
     
void Avto::print()
{
     cout<<Cost<<endl;
}  
int main()
{
 Avto carCost=0;
 carCost++;
 carCost++;
 carCost++;
 carCost.print();
 return 0;
}
Тут ++ перегружен. Для -- аналогично, только в функции перегрузки поменять ++ на --
C++
1
2
3
4
Avto Avto::operator -- (int)
{
     return Avto(this->Cost--);
}
Это перегрузка постфиксного инкремента и декремента. Для префиксного нужно будет убрать из списка аргументов int.

C++
1
2
3
4
Avto Avto::operator ++ ()
{
     return Avto(this->Cost++);
}
C++
1
++carCost;
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
10.11.2012, 20:12     Перегрузка операторов #8
Цитата Сообщение от BumerangSP Посмотреть сообщение
Хотя, я думал, что cstdlib итак должен подключаться. Видимо, не везде.
Как же он должен подключиться, если его не подключать явно. Он может быть включен в некоторые другие стандартные заголовки, например, в iostream. Но это всего лишь реализация конкретного компилятора. Полагаться на нее не стоит, нужно явно включать необходимые заголовки.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
10.11.2012, 21:01     Перегрузка операторов #9
Toshkarik, да, вот у меня как раз он был включен. Поэтому и не вспомнил)
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
11.11.2012, 14:12  [ТС]     Перегрузка операторов #10
Каким образом нужно перегрузить оператор "[]", чтобы можно было получать и изменять значение соответствующего элемента массива. Вот клас, только вод с перегрузкой не могу разобратся, как это реализовать.

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
#include <iostream>
using namespace std;
 
class Masyv
{
    int mas[4];
    int i;
public:
    void GetValue();
    void Show();
    Masyv operator [](int);
};
 
void Masyv::GetValue()
{
    for(int i=1;i<4;i++)
    {
    cout<<"Введите "<<i<<"-й элемент: "<<endl;
    cin>>mas[i];
    }
}
 
void Masyv::Show()
{
    for(int i=1;i<4;i++)
    {
    cout<<i<<"-й элемент: "<<mas[i]<<endl;
    }
}
 
Masyv Masyv::operator [](int)
{
 
}
 
int main()
{
    Masyv obj;
    obj.GetValue();
    obj.Show();
}
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
11.11.2012, 17:53     Перегрузка операторов #11
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
#include <iostream>
using namespace std;
 
class Masyv
{
    int mas[4];
  //  int i;
public:
    Masyv();      
    void GetValue();
    void Show();
    int& operator [](const int);
};
 
Masyv::Masyv()
{
    mas[4]={0};           
 
}
 
void Masyv::GetValue()
{
    for(int i=1;i<4;i++)
    {
    cout<<"Введите "<<i<<"-й элемент: "<<endl;
    cin>>mas[i];
    }
}
 
void Masyv::Show()
{
    for(int i=1;i<4;i++)
    {
    cout<<i<<"-й элемент: "<<mas[i]<<endl;
    }
}
 
int& Masyv::operator [](const int i)
{
  return this->mas[i];
}
 
int main()
{
    Masyv obj;
    obj.GetValue();
    obj[3]=33;
    obj.Show();
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2012, 20:18     Перегрузка операторов
Еще ссылки по теме:

Перегрузка операторов C++
Перегрузка операторов! C++
Перегрузка операторов C++

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

Или воспользуйтесь поиском по форуму:
Leew
 Аватар для Leew
1 / 1 / 0
Регистрация: 12.10.2012
Сообщений: 29
11.11.2012, 20:18  [ТС]     Перегрузка операторов #12
BumerangSP, большое спасибо за помощь.
Yandex
Объявления
11.11.2012, 20:18     Перегрузка операторов
Ответ Создать тему
Опции темы

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