Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

17.01.2012, 18:17. Просмотров 1468. Ответов 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ого и т. д! :) - C++
Задан массив чисел. К первому числу прибавить первую цифру второго, ко 2му -- 1ую цифру 3его и т. д. К последнему числу прибавить первую...

нужно чтобы в строке если встречается символ то прибавить соответствующую цифру к числу - C++
как опериравать строками? нужно чтобы в строке если встречается сивол то прибавить соответствующую цифру к числу вот код: #include...

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - "указателЯ" Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

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

Ошибка компиляции (преобразование объекта класса в объект другого класса) - C++
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...

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

24
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
17.01.2012, 18:22 #2
зачем b = getHour(sec);?
b не должно изменяться (правда в итоге после возврата из ф-ии оно и не изменится))
и передавай параметр в ф-ю по константной ссылке
0
kravam
быдлокодер
1705 / 892 / 45
Регистрация: 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
быдлокодер
1705 / 892 / 45
Регистрация: 04.06.2008
Сообщений: 5,524
17.01.2012, 18:59 #5
Код-то дашь весь?
0
dimcoder
Полярный
467 / 440 / 68
Регистрация: 11.09.2011
Сообщений: 1,142
17.01.2012, 18:59 #6
Цитата Сообщение от BenBen Посмотреть сообщение
Vremya b = c;
А 'c' это типа глобальная? Давайте весь код.
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 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
Жарю без масла
864 / 746 / 168
Регистрация: 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
Жарю без масла
864 / 746 / 168
Регистрация: 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
быдлокодер
1705 / 892 / 45
Регистрация: 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
быдлокодер
1705 / 892 / 45
Регистрация: 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
19.01.2012, 20:18
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2012, 20:18
Привет! Вот еще темы с ответами:

Правда, что указатель класса-наследника не может указывать на объект класса-родителя? - C++
Доброго времени суток! Пример кода ниже. Правда ли , что указатель класса-наследника не может указывать на объект класса-родителя? ...

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

Создание статической функции класса, которая принимает экземпляр этого же класса как объект - C++
Привет. Есть такой код class Model { public: Model(); Model(int verticesSize, int facesSize); ~Model(); static void...

Индексация массива класса, через объект этого класса - C++
class A{ char c;//? - размер массива public: A(int C){c;} }; int main(){ A a(5);//вносим размер массива getch(); ...


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

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

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