Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
1

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

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

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

Пишу через френд
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);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.01.2012, 18:17
Ответы с готовыми решениями:

Создать обЪект класса , у которого в параметрах конструктора объект этого же класса
Вот код: TOgmGraphicsClass = class of TOgmGraphicsBlock; TOgmGraphicsBlock =...

К числу n прибавить 10 в степени nc
# include <stdio.h> # include <math.h> int main() { short n; int a,b,r; int nc,q,q1; int...

Как прибавить 10% к числу?
друзья, не получается прибавить 10% к числу. Можете показать, как это выглядит в синтаксисе? ...

Прибавить к одному числу
Здравствуйте! Возник вопрос все выходные сидел и ломал голову Например в вводится в textbox ряд...

24
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
17.01.2012, 18:22 2
зачем b = getHour(sec);?
b не должно изменяться (правда в итоге после возврата из ф-ии оно и не изменится))
и передавай параметр в ф-ю по константной ссылке
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.01.2012, 18:49 3
BenBen, дай весь код
0
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;
}
Все равно не работает
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
17.01.2012, 18:59 5
Код-то дашь весь?
0
Полярный
476 / 448 / 158
Регистрация: 11.09.2011
Сообщений: 1,156
17.01.2012, 18:59 6
Цитата Сообщение от BenBen Посмотреть сообщение
Vremya b = c;
А 'c' это типа глобальная? Давайте весь код.
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
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);
}
пробуй
0
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);
};
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
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 минуту
и не забудь: исправляя объявления - исправь определения
1
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
17.01.2012, 19:18  [ТС] 10
чет понять не могу зачем конст нужен?

если без френдов то должен 1 параметр передаваться?
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
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
1
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
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;
}
...Вроде компилится...
1
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
19.01.2012, 20:07  [ТС] 13
И все таки не работает число + объект
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
19.01.2012, 20:15 14
Дай неработающий код и будь внимательнее на этот раз
0
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);
}
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
19.01.2012, 20:24 16
Короче, что мне надо:
1) Весь код
2) Вводные данные
3) Чё на выходе
4) Чё ожидаешь

Я так работаю, я всегда свои вопросы оформлял так и никто от меня не отмахивался
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
19.01.2012, 20:25 17
BenBen, просили дать неработающий код, т.е. покажите где и как вы этим пользуетесь
0
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 минуты
Так то он работает (надеюсь правильно) но вот с перегрузкой этой застрял.
И сижу туплю не могу понять как без френдов написать
0
Жарю без масла
867 / 749 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
19.01.2012, 20:39 19
Цитата Сообщение от BenBen Посмотреть сообщение
C++
1
10 + t1; //не работает
а что вы от этого хотите? чтобы t1 менялось? так этого быть не должно, ведь когда вы пишите
2 + 3 тройка же не должна магическим образом превращаться в пятерку
0
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
19.01.2012, 20:41  [ТС] 20
То есть должен вернуть копию объекта?
0
19.01.2012, 20:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.01.2012, 20:41
Помогаю со студенческими работами здесь

К каждому числу прибавить предыдущее
Дан вектор чисел произвольной длины. К каждому числу прибавить предыдущее.

Прибавить единичку к числу с нулями
Добрый вечер! Есть переменная &quot;head123_0000001&quot;. Необходимо прибавить к ней единичку, чтобы...

К числу рекурсивно прибавить другое число
Здравствуйте. Есть число $a = 5; Нужно к этому числу прибавлять $b = 2, чтобы в результате...

К числу введённому с клавиатуры прибавить число
Нужно к числу введённому с клавиатуры прибавить число. Вроде бы всё просто до смеха. И разжёванно....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru