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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
#1

К числу прибавить объект класса - C++

17.01.2012, 18:17. Просмотров 1293. Ответов 24
Метки нет (Все метки)

Не получается перегрузить '+' для сложения числа с объектом

Пишу через френд
C++
1
friend Vremya operator + (int a, Vremya );
C++
1
2
3
4
5
6
7
8
9
Vremya operator + (int a, Vremya b)
{
        int sec = getSec(b);         //getSec - перевод в секунды, getHour - перевод в часы
        while (a-- != 0)
        {
        sec++;
        }
        return b = getHour(sec);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2012, 18:17     К числу прибавить объект класса
Посмотрите здесь:

В конструктор класса передать объект этого класса C++
C++ нужно чтобы в строке если встречается символ то прибавить соответствующую цифру к числу
C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
C++ Индексация массива класса, через объект этого класса
как узнать,является данный объект класса А1 наследником класса А2 C++
Создание статической функции класса, которая принимает экземпляр этого же класса как объект C++
C++ Создать объект внутри класса, который может вызывать функцию этого класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.01.2012, 18:22     К числу прибавить объект класса #2
зачем b = getHour(sec);?
b не должно изменяться (правда в итоге после возврата из ф-ии оно и не изменится))
и передавай параметр в ф-ю по константной ссылке
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,341
17.01.2012, 18:49     К числу прибавить объект класса #3
BenBen, дай весь код
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
17.01.2012, 18:57  [ТС]     К числу прибавить объект класса #4
C++
1
2
3
4
5
6
7
8
9
10
11
Vremya operator + (int a, const &Vremya b)
{
        Vremya b = c;
        int sec = getSec(c);         
        while (a-- != 0)
        {
        sec++;
        }
        c = getHour(sec);
        return b;
}
Все равно не работает
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,341
17.01.2012, 18:59     К числу прибавить объект класса #5
Код-то дашь весь?
dimcoder
Полярный
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,115
17.01.2012, 18:59     К числу прибавить объект класса #6
Цитата Сообщение от BenBen Посмотреть сообщение
Vremya b = c;
А 'c' это типа глобальная? Давайте весь код.
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.01.2012, 19:05     К числу прибавить объект класса #7
Цитата Сообщение от BenBen Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
Vremya operator + (int a, const &Vremya b)
{
        Vremya b = c;
        int sec = getSec(c);         
        while (a-- != 0)
        {
        sec++;
        }
        c = getHour(sec);
        return b;
}
Все равно не работает
чем отличаются 2 b и с которой ты работаешь?

Добавлено через 1 минуту
C++
1
2
3
4
5
6
Vremya operator + (int a, const Vremya& b)
{
        int sec = getSec(b);         
        sec += a;
        return getHour(sec);
}
пробуй
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
17.01.2012, 19:07  [ТС]     К числу прибавить объект класса #8
Vremya.cpp
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
//---------------------------------------------------------------------------
Vremya::Vremya()
{
        sec = 0;
        min = 0;
        hour = 0;
}
//---------------------------------------------------------------------------
Vremya::Vremya(int _hour, int _min, int _sec)
{
        sec = _sec;
        min = _min;
        hour = _hour;
}
//---------------------------------------------------------------------------
Vremya::Vremya(Vremya &t)
{
        hour = t.hour;
        min = t.min;
        sec = t.sec;
}
//---------------------------------------------------------------------------
int getSec(Vremya t)
{
        int sec = t.sec + t.min*60 + t.hour*3600;
        return sec;
}
//---------------------------------------------------------------------------
Vremya getHour(int a)
{
        Vremya t;
        t.hour = a/3600;
        t.min = (a - t.hour*3600)/60;
        t.sec = a - t.hour*3600 - t.min*60;
        return t;
}
//---------------------------------------------------------------------------
 
Vremya &Vremya::operator ++ ()
{
        int sec = getSec(*this);
        sec++;
        *this = getHour(sec);
        return *this;
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator -- ()
{
        int sec = getSec(*this);
        sec--;
        *this = getHour(sec);
        return *this;
}
//---------------------------------------------------------------------------
Vremya Vremya::operator ++ (int)
{
        Vremya a = *this;
        int sec = getSec(*this);
        sec++;
        *this = getHour(sec);
        return a;
}
//---------------------------------------------------------------------------
Vremya Vremya::operator -- (int)
{
        Vremya a = *this;
        int sec = getSec(*this);
        sec--;
        *this = getHour(sec);
        return a;
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator + (int a)
{
        int sec = getSec(*this);
        sec += a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator - (int a)
{
        int sec = getSec(*this);
        sec += a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator += (int a)
{
        int sec = getSec(*this);
        sec += a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator -= (int a)
{
        int sec = getSec(*this);
        sec -= a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
 
Vremya &Vremyae::operator = (Vremya t)
{
        sec = t.sec;
        min = t.min;
        hour = t.hour;
        return *this;
}
//---------------------------------------------------------------------------
Vremya.h
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
class Vremya
{
        private:
    int sec, min, hour;
        
        public:
    Vremya();
    Vremya(int _sec, int _min, int _hour);
        Vremya(Vremya &t);
 
    void Show();
 
    friend int getSec(Vremya t);
        friend Vremya getHour(int a);
 
    Vremya &operator ++ ();
    Vremya &operator -- ();
 
    Vremya operator ++ (int);
    Vremya operator -- (int);
    
    Vremya &operator += (int a);
    Vremya &operator -= (int a);
 
    Vremya &operator + (int a);
    Vremya &operator - (int a);
 
    friend Vremya operator + (int a, Vremya &);
    friend Vremya operator - (int a, Vremya);
    friend Vremya operator - (Vremya &t1, Vremya &t2);
 
    Vremya &operator = (Vremya t);
};
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.01.2012, 19:17     К числу прибавить объект класса #9
Цитата Сообщение от retmas Посмотреть сообщение
C++
1
2
3
4
5
6
Vremya operator + (int a, const Vremya& b)
{
        int sec = getSec(b);         
        sec += a;
        return getHour(sec);
}
пробуй

Добавлено через 1 минуту
если хочешь короче
C++
1
2
3
4
Vremya operator + (int a, const Vremya& b)
{
        return getHour(getSec(b) + a);
}
Добавлено через 2 минуты
и вместо
C++
1
2
3
4
        friend int getSec(Vremya t)
        friend Vremya operator + (int a, Vremya &);
        friend Vremya operator - (int a, Vremya);
        friend Vremya operator - (Vremya &t1, Vremya &t2);
лучше переделай чтоб было
C++
1
2
3
4
        friend int getSec(const Vremya& t)
        friend Vremya operator + (int a, const Vremya &);
        friend Vremya operator - (int a, const Vremya&);
        friend Vremya operator - (const Vremya &t1, const Vremya &t2);
Добавлено через 1 минуту
а еще лучше переписать так, чтоб избавится от френдов (для этого все есть)

Добавлено через 2 минуты
да и не увидел сразу
C++
1
2
Vremya &operator = (Vremya t);
Vremya(Vremya &t);
=>
C++
1
2
Vremya &operator = (const Vremya& t);
Vremya(const Vremya &t);
Добавлено через 1 минуту
и не забудь: исправляя объявления - исправь определения
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
17.01.2012, 19:18  [ТС]     К числу прибавить объект класса #10
чет понять не могу зачем конст нужен?

если без френдов то должен 1 параметр передаваться?
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.01.2012, 19:35     К числу прибавить объект класса #11
Цитата Сообщение от BenBen Посмотреть сообщение
чет понять не могу зачем конст нужен?
чтобы например компилятор ругался на вот такое безобразие:
C++
1
2
3
4
5
6
7
8
9
Vremya operator + (int a, Vremya b)
{
        int sec = getSec(b);         //getSec - перевод в секунды, getHour - перевод в часы
        while (a-- != 0)
        {
        sec++;
        }
        return b = getHour(sec);
}
как у вас было.

когда в ф-ю передается параметр в виде const Vremya& b
1) не создается лишний временный обьект типа Vremya (ссылка)
2) компилятор понимает, что b - не должно изменяться (const)

Добавлено через 8 минут
Цитата Сообщение от BenBen Посмотреть сообщение
если без френдов то должен 1 параметр передаваться?
нет. просто обьявляете их вне класса.
если вы реализуете
C++
1
2
        Vremya &operator += (int a);
        Vremya &operator -= (int a);
как ф-ии - члены, то
C++
1
2
        friend Vremya operator + (int a, Vremya &);
        friend Vremya operator - (int a, Vremya);
реализуются как обычные ф-ии не члены с помощью += / -=
==> отпадает надобность в friend
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,341
17.01.2012, 23:38     К числу прибавить объект класса #12
BenBen, я бы сделал две вещи, поправил определение и объявление operator =, то есть:
C++
1
2
3
4
5
6
7
8
9
10
11
Vremya &operator = (const Vremya& t);
 
//тут всякий код
 
Vremya &Vremya::operator = (const Vremya& t)
{
        sec = t.sec;
        min = t.min;
        hour = t.hour;
        return *this;
}
...Вроде компилится...
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
19.01.2012, 20:07  [ТС]     К числу прибавить объект класса #13
И все таки не работает число + объект
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,341
19.01.2012, 20:15     К числу прибавить объект класса #14
Дай неработающий код и будь внимательнее на этот раз
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
19.01.2012, 20:18  [ТС]     К числу прибавить объект класса #15
C++
1
2
3
4
5
6
Vremya operator + (int a, const Vremya &t)
{
        int sec = getSec(t);
        sec += a;
        return getHour(sec);
}
kravam
быдлокодер
1695 / 874 / 44
Регистрация: 04.06.2008
Сообщений: 5,341
19.01.2012, 20:24     К числу прибавить объект класса #16
Короче, что мне надо:
1) Весь код
2) Вводные данные
3) Чё на выходе
4) Чё ожидаешь

Я так работаю, я всегда свои вопросы оформлял так и никто от меня не отмахивался
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
19.01.2012, 20:25     К числу прибавить объект класса #17
BenBen, просили дать неработающий код, т.е. покажите где и как вы этим пользуетесь
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
19.01.2012, 20:38  [ТС]     К числу прибавить объект класса #18
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
//---------------------------------------------------------------------------
#include <string.h>
#include <stdio.h>
#include <iostream.h>
#include <vcl.h>
#include <stdlib.h>
#include "Time.h"
#pragma hdrstop
//---------------------------------------------------------------------------
Vremya::Vremya()
{
        sec = 0;
        min = 0;
        hour = 0;
}
//---------------------------------------------------------------------------
Vremya::Vremya(int h, int m, int s)
{
        sec = s;
        min = m;
        hour = h;
}
//---------------------------------------------------------------------------
Vremya::Vremya(const Vremya &t)
{
        hour = t.hour;
        min = t.min;
        sec = t.sec;
}
//---------------------------------------------------------------------------
int getSec(const Vremya &t)
{
        int sec = t.sec + t.min*60 + t.hour*3600;
        return sec;
}
//---------------------------------------------------------------------------
Vremya getHour(int a)
{
        Vremya t;
        t.hour = a/3600;
        t.min = (a - t.hour*3600)/60;
        t.sec = a - t.hour*3600 - t.min*60;
        return t;
}
//---------------------------------------------------------------------------
void Vremya::Show()
{
        cout<<hour<<":"<<min<<":"<<sec;
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator ++ ()
{
        int sec = getSec(*this);
        sec++;
        *this = getHour(sec);
        return *this;
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator -- ()
{
        int sec = getSec(*this);
        sec--;
        *this = getHour(sec);
        return *this;
}
//---------------------------------------------------------------------------
Vremya Vremya::operator ++ (int)
{
        Vremya a = *this;
        int sec = getSec(*this);
        sec++;
        *this = getHour(sec);
        return a;
}
//---------------------------------------------------------------------------
Vremya Vremya::operator -- (int)
{
        Vremya a = *this;
        int sec = getSec(*this);
        sec--;
        *this = getHour(sec);
        return a;
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator + (int a)
{
        int sec = getSec(*this);
        sec += a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator - (int a)
{
        int sec = getSec(*this);
        sec -= a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator += (int a)
{
        int sec = getSec(*this);
        sec += a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator -= (int a)
{
        int sec = getSec(*this);
        sec -= a;
        return *this = getHour(sec);
}
//---------------------------------------------------------------------------
Vremya operator + (int a, const Vremya &t)
{
        int sec = getSec(t);
        sec += a;
        return getHour(sec);
}
//---------------------------------------------------------------------------
Vremya &Vremya::operator = (const Vremya &t)
{
        sec = t.sec;
        min = t.min;
        hour = t.hour;
        return *this;
}
 
 
//---------------------------------------------------------------------------
 
#pragma package(smart_init)
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
//---------------------------------------------------------------------------
 
#ifndef VremyaH
#define VremyaH
 
 
class Vremya
{
        private:
    int sec, min, hour;
 
        public:
    Vremya();
    Vremya(int s, int m, int h);
        Vremya(const Vremya &t);
 
    void Show();
 
    friend int getSec(const Vremya &t);
        friend Vremya getHour(int a);
 
    Vremya &operator ++ ();
    Vremya &operator -- ();
 
    Vremya operator ++ (int);
    Vremya operator -- (int);
 
    Vremya &operator += (int a);
    Vremya &operator -= (int a);
 
    Vremya &operator + (int a);
    Vremya &operator - (int a);
 
        Vremya &operator = (const Vremya &t);
 
    friend Vremya operator + (int a, const Vremya &t);
    friend Vremya operator - (int a, const Vremya &t);
 
 
};
//---------------------------------------------------------------------------
#endif

C++
1
2
3
4
5
6
7
В мейне
Vremya t1(12,0,0);
Vremya t2;
t1+= 10; //работает
t1 = t2; //работает
t1 + 10; //работает
10 + t1; //не работает
Добавлено через 2 минуты
Так то он работает (надеюсь правильно) но вот с перегрузкой этой застрял.
И сижу туплю не могу понять как без френдов написать
retmas
Жарю без масла
858 / 740 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
19.01.2012, 20:39     К числу прибавить объект класса #19
Цитата Сообщение от BenBen Посмотреть сообщение
C++
1
10 + t1; //не работает
а что вы от этого хотите? чтобы t1 менялось? так этого быть не должно, ведь когда вы пишите
2 + 3 тройка же не должна магическим образом превращаться в пятерку
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2012, 20:41     К числу прибавить объект класса
Еще ссылки по теме:

Указатель на объект базового класса и адрес объекта производного класса C++
C++ Статический указатель класса на объект этого же класса
Недопустимый неполный тип , или как передать в функцию указатель на объект класса , или просто объект C++
Как корректно передать в метод шаблонного класса объект шаблонного класса в качестве параметра? C++
C++ Массив. Прибавить к 1ому числу 1ую цифру 2ого и т. д! :)

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

Или воспользуйтесь поиском по форуму:
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
19.01.2012, 20:41  [ТС]     К числу прибавить объект класса #20
То есть должен вернуть копию объекта?
Yandex
Объявления
19.01.2012, 20:41     К числу прибавить объект класса
Ответ Создать тему
Опции темы

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