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

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

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

Массив. Прибавить к 1ому числу 1ую цифру 2ого и т. д! :)
Задан массив чисел. К первому числу прибавить первую цифру второго, ко 2му --...

нужно чтобы в строке если встречается символ то прибавить соответствующую цифру к числу
как опериравать строками? нужно чтобы в строке если встречается сивол то...

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом...

Можно ли создать объект класса с таким же именем как у самого класса?
Можно ли создать объект класса с таким же именем как у самого класса? Ну или...

как узнать,является данный объект класса А1 наследником класса А2
Всем привет)есть классы S, A1, A2, B1, B2. Иерархия наследования следующая ...

24
retmas
Жарю без масла
865 / 747 / 225
Регистрация: 13.01.2012
Сообщений: 1,702
17.01.2012, 18:22 #2
зачем b = getHour(sec);?
b не должно изменяться (правда в итоге после возврата из ф-ии оно и не изменится))
и передавай параметр в ф-ю по константной ссылке
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
17.01.2012, 18:49 #3
BenBen, дай весь код
0
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;
}
Все равно не работает
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
17.01.2012, 18:59 #5
Код-то дашь весь?
0
dimcoder
Полярный
467 / 440 / 157
Регистрация: 11.09.2011
Сообщений: 1,142
17.01.2012, 18:59 #6
Цитата Сообщение от BenBen Посмотреть сообщение
Vremya b = c;
А 'c' это типа глобальная? Давайте весь код.
0
retmas
Жарю без масла
865 / 747 / 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
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);
};
0
retmas
Жарю без масла
865 / 747 / 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
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
17.01.2012, 19:18  [ТС] #10
чет понять не могу зачем конст нужен?

если без френдов то должен 1 параметр передаваться?
0
retmas
Жарю без масла
865 / 747 / 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
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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
BenBen
0 / 0 / 0
Регистрация: 16.01.2012
Сообщений: 15
19.01.2012, 20:07  [ТС] #13
И все таки не работает число + объект
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
19.01.2012, 20:15 #14
Дай неработающий код и будь внимательнее на этот раз
0
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);
}
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
19.01.2012, 20:24 #16
Короче, что мне надо:
1) Весь код
2) Вводные данные
3) Чё на выходе
4) Чё ожидаешь

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

Ошибка компиляции (преобразование объекта класса в объект другого класса)
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции......

Использование в качестве поля класса указатель на объект другого класса
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только...

Указатель на объект базового класса и адрес объекта производного класса
Пример кода: class Class1 { public: Class1(int x) { j = new int;...

Создать объект внутри класса, который может вызывать функцию этого класса
Ребята помогите уже несколько дней мучаюсь. Хочу сделать программу в консоле...


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

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

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