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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
11.11.2010, 00:40     Перегрузка оператора + #1
Осуществляю перегрузку оператора +. и вот почему-то член класса s меняет свою длину с 4 до 7
и мне вот это не понятно.. Подскажите, пожалуйста!
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
#include <iostream>
#include <string.h>
 
using std::cout;
using std::cin;
using std::endl;
 
class Arifm
{
public: 
    char s[4];
    Arifm(){};
    Arifm(char *xy)
    {
        strcpy(s,xy);
    }
    void show()
    {
        cout<<s<<endl;
    }
    Arifm operator+ (Arifm y);
};
 
Arifm Arifm::operator+ (Arifm y)
{
    Arifm x;
    
    x.s[0] = s[0] + y.s[0]-48;
    
    x.s[1] = s[1] + y.s[1]-48;
    
    x.s[2] = s[2] + y.s[2]-48;
    
    return x;
}
 
int main()
{
    char x1[4] = "111", y1[4] = "111";
    
    Arifm x(x1),y(y1);
    
    x = x + y;
    
    x.show();
        
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2010, 00:40     Перегрузка оператора +
Посмотрите здесь:

C++ Перегрузка оператора +=
Перегрузка оператора = C++
Перегрузка оператора * C++
Перегрузка оператора ~ C++
C++ Перегрузка оператора <<
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.11.2010, 01:03     Перегрузка оператора + #2
Цитата Сообщение от velodro Посмотреть сообщение
и вот почему-то член класса s меняет свою длину с 4 до 7
С чего вы это взяли?
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
11.11.2010, 01:10  [ТС]     Перегрузка оператора + #3
если вставить strlen(x.s) он выдаст 7
а x.show выдаёт вообще 22111, а мне казалось должно выдать 222
.::.DIMA.::.
142 / 142 / 4
Регистрация: 26.10.2008
Сообщений: 782
11.11.2010, 01:18     Перегрузка оператора + #4
У вас какой компилятор? У меня правельный результат. Но в любом случае, не помешало бы перегрузить оператор '='.
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.11.2010, 01:21     Перегрузка оператора + #5
velodro, дело в том, что при вызове конструктора "Arifm () {}" в переменной "s" лежит мусор, и последний элемент массива не равен нулю, а в языке Си строками считаются массивы чаров, оканчивающиеся нулями. Поэтому strlen уходит за пределы массива и выдаёт неправильную длину.

Рекомендую в языке Си++ использовать не массивы чаров, а класс std::string.
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
11.11.2010, 01:22     Перегрузка оператора + #6
x = x + y;
вам нужно перегрузить равно
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
11.11.2010, 01:26  [ТС]     Перегрузка оператора + #7
у меня unix компилятор (на ubuntu компилирую)
а без перегрузки = не пойдёт?
Crudelis
Шаровик затейник
 Аватар для Crudelis
667 / 409 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
11.11.2010, 01:32     Перегрузка оператора + #8
velodro, думаю не так уж сложно перегрузить оператор =
C++
1
2
3
4
Arifm operator= (Arifm y)
{
     return *this;
}
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
11.11.2010, 01:36     Перегрузка оператора + #9
Во-первых, оператор присвоения в данном случае перегружать не надо, а во-вторых, правильно это делать так:
C++
1
2
3
4
5
Arifm operator = (const Arifm & y) {
        ...
 
        return *this;
}
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
11.11.2010, 07:49     Перегрузка оператора + #10
volovzi, А еще правильнее не забывать проверку на равенство самому себе.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.11.2010, 10:44     Перегрузка оператора + #11
Опрератор "=" здесь перегружать не нужно, просто не имеет смысла.

Цитата Сообщение от ForEveR Посмотреть сообщение
А еще правильнее не забывать проверку на равенство самому себе.
В книгах, которые я читал, про это как-то в двух словах сказано. ForEveR, можешь в двух словах описать суть этой проверки?
OdNairy
 Аватар для OdNairy
7 / 7 / 1
Регистрация: 07.02.2010
Сообщений: 22
11.11.2010, 11:06     Перегрузка оператора + #12
Цитата Сообщение от Kastaneda Посмотреть сообщение
можешь в двух словах описать суть этой проверки
Спрашивали не меня, но я отвечу =)

Представьте, что вы делаете свой класс строки. Создаёте несколько объектов своего класса.
Как должно сейчас равно происходить представляете? Удаление того, что было. Присвоение нового.
А теперь представьте, что делает присваивание самому себе.И что получиться? Вы сразу удаляете данные, а потом. ... Пшик. Присвоить уже нечего - данные удалены. Поэтому выполняется проверка скрытого указателя this на то, что принимается, и в случае равенства - просто выход.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.11.2010, 11:22     Перегрузка оператора + #13
Так "=" это же бинарный оператор, как может быть передан this? Разве, что только так:
C++
1
object=object;
Но тут программист сам видит, что происходит, да и смысла в этой строке нет. Что-то я не совсем понял ваше объяснение(

Добавлено через 48 секунд
Можно пример кода, где такая проверка необходима?
OdNairy
 Аватар для OdNairy
7 / 7 / 1
Регистрация: 07.02.2010
Сообщений: 22
11.11.2010, 11:36     Перегрузка оператора + #14
this передаётся всегда в метод класса. Потому он и называется неявный указатель.
За точность кода сейчас не ручаюсь, потому что придумываю и сразу пишу сюда =)
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
class Row {
public:
    Row();  // default constuctor
    Row(const char* s);     // copy string to class
    Row(const Row& orig);   //copy constructor
    virtual ~Row();
 
     Row& operator= (const Row&);
 
protected:
    char* arr;
    int ln;
};
 
#endif
 
//it's e.g. so without ctors
 
Row&  Row::operator =(const Row& orig){
    if(*this == orig) return *this;
 
    delete[] this->arr;
    
    ln = orig.ln;
    this->arr = new char [t.ln + 1];
 
    charset(arr,0,t.ln + 1);    //Mine func like memset(), but just for char
    strcpy(this->arr, orig.arr);
    return *this;
}
Пример взял всё тот же - со строкой ( просто недавно помогал делать, вот и остался исходник).
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.11.2010, 11:52     Перегрузка оператора + #15
this передаётся всегда в метод класса. Потому он и называется неявный указатель.
Да это то я знаю, я имел ввиду как this может быть левым операндом?
Ведь
C++
1
object=object;
это глупо.

По коду: теперь понятно, да тут действительно нужна проверка на равенство самому себе.
OdNairy
 Аватар для OdNairy
7 / 7 / 1
Регистрация: 07.02.2010
Сообщений: 22
11.11.2010, 12:44     Перегрузка оператора + #16
Это не глупо. Когда вы делаете присваивание объектов -это выглядит странно,а что если это будет набон указателей? =)
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
11.11.2010, 13:55  [ТС]     Перегрузка оператора + #17
Прочитав, что проблема с перегруженным конструктором Arifm() {}, т. к. со string не работал, то изменил вот так:

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
#include <iostream>
#include <string.h>
 
using std::cout;
using std::cin;
using std::endl;
 
class Arifm
{
    char s[4];
public:
void put(char *xy)
    {
        strcpy(s,xy);
    }
    void show()
    {
        cout<<s<<endl;
    }
    Arifm operator+ (Arifm y);
    Arifm operator= (Arifm y)
    {
        return *this;
    }
};
 
Arifm Arifm::operator+ (Arifm y)
{
    Arifm x;
    
    x.s[0] = s[0] + y.s[0]-48;
    x.s[1] = s[1] + y.s[1]-48;
    x.s[2] = s[2] + y.s[2]-48;
 
    return x;
}
 
int main()
{
    char x1[4] = "111", y1[4] = "111";
    
    Arifm x,y;
    
    x.put(x1);
    y.put(y1);
    
    x = x + y;
    
    x.show();
        
    return 0;
}
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
11.11.2010, 14:30     Перегрузка оператора + #18
velodro, когда получете символы вместо "-48" все же лучше писать "-'0'", что бы не зависить от кодировки.


Цитата Сообщение от OdNairy Посмотреть сообщение
Это не глупо. Когда вы делаете присваивание объектов -это выглядит странно,а что если это будет набон указателей? =)
Ну может быть, просто я в своей практике пока с такой проблемой не сталкивался.
velodro
72 / 1 / 1
Регистрация: 28.11.2009
Сообщений: 78
11.11.2010, 23:48  [ТС]     Перегрузка оператора + #19
но у меня выдаёт 111, а должен 222.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.11.2010, 12:37     Перегрузка оператора +
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4237 / 2770 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
12.11.2010, 12:37     Перегрузка оператора + #20
Цитата Сообщение от velodro Посмотреть сообщение
но у меня выдаёт 111, а должен 222.
Уберите эту бесполезную (да и не правильную) перегрузку оператора "=" (при x=x+y после вашего оператора будет так x=x) и будет вам счастье)))
Yandex
Объявления
12.11.2010, 12:37     Перегрузка оператора +
Ответ Создать тему
Опции темы

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