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

Передача объекта в функцию - C++

Восстановить пароль Регистрация
 
 
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:31     Передача объекта в функцию #1
подскажите что тут не так у меня?!
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
/*
 * 5. Поле first — целое положительное число, часы; 
 * поле second — целое положительное число, минуты. 
 * Реализовать внешнюю функцию сложения двух объектов данного типа. 
 * Результат возвращать в качестве объекта. В реализации функции учесть, 
 * что значение поля минуты может быть только в диапазоне от 0 до 59. 
 */
#include <iostream>
using namespace std;
int init_,error_=0;
 
class vr
{
    private:
    int first;
    int second;
    public:
    vr() {first=0;second=0;}
    int init(int f,int s)
    {
        if ((f>=0) && (f<=23) && (s>=0) && (s<=59)) {first=f; second=s; return 0;}
        else error();
    }
    void read()
    {
        int f,s;
        cin>>f>>s;
        init_=init(f,s);
    }
    void error()
    {
        cout<<"error!";
        error_=1;
    }
    void display()
    {
        if (init_==0)
        cout<<first<<" "<<second;
    }
    
};
vr sum(vr x,vr y)
{
    vr temp;
    temp=x+y;
    temp.display();
}
 
int main()
{
    vr o1,o2;
    cout<<"obj1\n";
    o1.read();
    o1.display();
    if (error_==0)
    {cout<<"\nobj2\n";
    o2.read();
    o2.display();
    sum(o1,o2);
}
    
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.06.2015, 21:37     Передача объекта в функцию #2
Цитата Сообщение от kirill1904 Посмотреть сообщение
что тут не так у меня?!
Не хватает описания проблемы.
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:39  [ТС]     Передача объекта в функцию #3
проблема с передачей в функцию, и сложении объектов
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,797
Завершенные тесты: 1
21.06.2015, 21:40     Передача объекта в функцию #4
1.
отсутствует operator+

C++
1
2
3
4
5
6
vr sum(vr x,vr y)
{
    vr temp;
    temp=x+y;  //<--- не умеет складываться
    temp.display();
}

2.
C++
1
2
3
4
5
int init(int f,int s)
    {
        if ((f>=0) && (f<=23) && (s>=0) && (s<=59)) {first=f; second=s; return 0;}
        else error();
    }
функция должна вернуть наружу некий int.

но у вас, если ошибка - ничего не возвращается наружу.
это - UB, обычно в таких случаях возвращается мусор.
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.06.2015, 21:41     Передача объекта в функцию #5
Передачей чего? В какую функцию? Каких объектов?
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:42  [ТС]     Передача объекта в функцию #6
Цитата Сообщение от castaway Посмотреть сообщение
Не хватает описания проблемы.
Цитата Сообщение от castaway Посмотреть сообщение
Не хватает описания проблемы.
проблема со сложением 2х объектов

Добавлено через 1 минуту
Цитата Сообщение от hoggy Посмотреть сообщение
1.
отсутствует operator+

C++
1
2
3
4
5
6
vr sum(vr x,vr y)
{
    vr temp;
    temp=x+y;  //<--- не умеет складываться
    temp.display();
}

2.
C++
1
2
3
4
5
int init(int f,int s)
    {
        if ((f>=0) && (f<=23) && (s>=0) && (s<=59)) {first=f; second=s; return 0;}
        else error();
    }
функция должна вернуть наружу некий int.

но у вас, если ошибка - ничего не возвращается наружу.
это - UB, обычно в таких случаях возвращается мусор.
есть же
C++
1
return ;
подскажи как оператор+ правильно сделать?
нужно сложить поле first одного объекта с полем другого объекта, econd также
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.06.2015, 21:45     Передача объекта в функцию #7
Цитата Сообщение от kirill1904 Посмотреть сообщение
проблема со сложением 2х объектов
Цитата Сообщение от castaway Посмотреть сообщение
Каких объектов?
В чем проблема?
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:47  [ТС]     Передача объекта в функцию #8
в функции main описано два объекта о1 и о2 вот их нужно сложить и записать в 3 объект temp
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.06.2015, 21:57     Передача объекта в функцию #9
Цитата Сообщение от kirill1904 Посмотреть сообщение
подскажи как оператор+ правильно сделать?
C++
1
2
3
4
5
6
vr operator + ( const vr & rhs ) {
    vr result;
    result.first = first + rhs.first;
    result.second = second + rhs.second;
    return result;
}
Всё это внутри класса.
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:57  [ТС]     Передача объекта в функцию #10
Цитата Сообщение от castaway Посмотреть сообщение
В чем проблема?
в функции main описано два объекта о1 и о2 вот их нужно сложить и записать в 3 объект temp
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.06.2015, 21:59     Передача объекта в функцию #11
Я уже понял.
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 22:08  [ТС]     Передача объекта в функцию #12
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
2
3
4
5
6
vr operator + ( const vr & rhs ) {
* * vr result;
* * result.first = first + rhs.first;
* * result.second = second + rhs.second;
* * return result;
}
Всё это внутри класса.
подскажи еще как сделать чтобы при значении поля second=60 first увеличивался на один и оставшееся записвалось в second
например ввел 2 часа и 40 минут в первом объекте, и 1 час 34 минуты в итоге должно получится 4 часа 14 минут
заранее спасибо)
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,797
Завершенные тесты: 1
21.06.2015, 22:14     Передача объекта в функцию #13
Цитата Сообщение от kirill1904 Посмотреть сообщение
есть же
return ;
рассмотрим функцию поподробнее:

C++
1
2
3
4
5
int init(int f,int s)
    {
        if ((f>=0) && (f<=23) && (s>=0) && (s<=59)) {first=f; second=s; return 0;}
        else error();
    }
если выполнится первое условие, тогда сработает return 0;

что будет если оно не выполнится, и сработает ветка else ?
запуститься функция error();
а что будет дальше?

Цитата Сообщение от kirill1904 Посмотреть сообщение
подскажи как оператор+ правильно сделать?
как то так:

http://rextester.com/MNXF51354


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
#include <iostream>
 
class vr
{
    int hours;
    int minutes;
public:
    vr(const int h = 0, const int m = 0)
        :hours(h)
        ,minutes(m)
    { normalize(); }
    
    void normalize()
    {
        const auto h = minutes/60;
        hours += h;
        minutes -= h*60;
    }
    
    friend vr operator+(const vr& lhs, const vr& rhs)
    {
        vr result(lhs.hours + rhs.hours, lhs.minutes + rhs.minutes);
        result.normalize();
        return result;
    }
    
    template<class T> 
        friend ::std::basic_ostream<T>& 
    operator<<(::std::basic_ostream<T>& os, const vr& obj)
    {
        return os<<"hours: "<<obj.hours << " : minutes: "<<obj.minutes;
    }
    
    void set(const int h, const int m)
    {
        hours = h;
        minutes = m;
        normalize();
    }
    
};    
 
void read(vr& dst)
{
    int h,m;
    std::cin>>h>>m;
    dst.set(h,m);
}    
    
int main()
{
    vr o1, o2;
    read(o1);
    read(o2);
    
    
    vr o3 = o1 + o2;
    
    std::cout <<"o1: " << o1 << '\n';
    std::cout <<"o2: " << o2 << '\n';
    std::cout <<"o3: " << o3 << '\n';
}
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 22:27  [ТС]     Передача объекта в функцию #14
Цитата Сообщение от hoggy Посмотреть сообщение
если выполнится первое условие, тогда сработает return 0;
что будет если оно не выполнится, и сработает ветка else ?
запуститься функция error();
а что будет дальше?
дальше мне не надо ничего, нужно было только сложить объекты и сделать их как время
hoggy
5030 / 2113 / 403
Регистрация: 15.11.2014
Сообщений: 4,797
Завершенные тесты: 1
21.06.2015, 22:32     Передача объекта в функцию #15
Цитата Сообщение от kirill1904 Посмотреть сообщение
дальше мне не надо ничего, нужно было только сложить объекты и сделать их как время
дальше у вас будет жЁпа.

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

если вас устраивает жЁпа - хозяин барин.

кстати, гляньте на эту функцию:
C++
1
2
3
4
5
6
vr sum(vr x,vr y)
{
    vr temp;
    temp=x+y;  //<--- не умеет складываться
    temp.display();
}
она должна вернуть наружу результат сложения.
но она так же ничего не возвращает.

то бишь, здесь у вас точно такая же жЁпа.

вместо суммы вы будете получать случайный мусор.

сложили два временных объекта, получили мусор.
нормально чо.
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 22:35  [ТС]     Передача объекта в функцию #16
Цитата Сообщение от hoggy Посмотреть сообщение
как то так:
http://rextester.com/MNXF51354
делаю как у тебя в коде но что то ему не нравиться
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
#include <iostream>
using namespace std;
int init_,error_=0;
 
class vr
{
    private:
    int first;
    int second;
    public:
    vr(const int h = 0, const int m = 0):first(h),second(m) {normalize();}
    int init(int f,int s)
    {
        if ((f>=0) && (s>=0) && (s<=59)) {first=f; second=s; return 0;}
        else error();
    }
    void read()
    {
        int f,s;
        cin>>f>>s;
        init_=init(f,s);
    }
    void error()
    {
        cout<<"error!";
        error_=1;
    }
    void normalize()
    {
        const auto h = second/60;
        first += h;
        second -= h*60;
    }
    void display()
    {
        if (init_==0)
        cout<<""<<first<<" "<<second;
    }
    friend vr operator+(const vr& lhs, const vr& rhs)
    {
        vr result(lhs.first + rhs.first, lhs.second + rhs.second);
        result.normalize();
        return result;
    }
};
vr sum(vr x,vr y)
{
    vr temp;
    temp=x+y;
    cout<<"\n";
    temp.display();
}
int main()
{
    vr o1,o2;
    o1.read();
    o1.display();
    if (error_==0)
    { 
    cout<<"\n";
    o2.read();
    o2.display();
    sum(o1,o2);
    }
}
Добавлено через 3 минуты
Цитата Сообщение от hoggy Посмотреть сообщение
она должна вернуть наружу результат сложения.
но она так же ничего не возвращает.
то бишь, здесь у вас точно такая же жЁпа.
вместо суммы вы будете получать случайный мусор.
сложили два временных объекта, получили мусор.
нормально чо.
это я исправил) спасибо
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.06.2015, 22:36     Передача объекта в функцию #17
Цитата Сообщение от kirill1904 Посмотреть сообщение
подскажи еще как сделать чтобы при значении поля second=60 first увеличивался на один и оставшееся записвалось в second
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main() {
 
    // например ввел 2 часа и 40 минут в первом объекте, и 1 час 34 минуты в итоге должно получится 4 часа 14 минут 
    int h0 = 2;
    int m0 = 40;
 
    int h1 = 1;
    int m1 = 34;
 
    int h = h0 + h1;
    int mm = m0 + m1;
    h += mm / 60;
    int m = mm % 60;
 
    std::cout << "h = " << h << ", m = " << m << std::endl;
 
    return 0;
}
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 22:39  [ТС]     Передача объекта в функцию #18
Цитата Сообщение от castaway Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
int main() {
 
    // например ввел 2 часа и 40 минут в первом объекте, и 1 час 34 минуты в итоге должно получится 4 часа 14 минут 
    int h0 = 2;
    int m0 = 40;
 
    int h1 = 1;
    int m1 = 34;
 
    int h = h0 + h1;
    int mm = m0 + m1;
    h += mm / 60;
    int m = mm % 60;
 
    std::cout << "h = " << h << ", m = " << m << std::endl;
 
    return 0;
}
да только надо это сделать в классе
castaway
Эксперт С++
4837 / 2976 / 367
Регистрация: 10.11.2010
Сообщений: 11,008
Записей в блоге: 10
Завершенные тесты: 1
21.06.2015, 22:58     Передача объекта в функцию #19
Я тебе показал алгоритм с примером. Делай.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2015, 23:12     Передача объекта в функцию
Еще ссылки по теме:

C++ Классы: передача объекта в функцию
C++ Передача объекта в функцию или функцию друга
Передача объекта в вызывающую функцию C++

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

Или воспользуйтесь поиском по форуму:
kirill1904
0 / 0 / 0
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 23:12  [ТС]     Передача объекта в функцию #20
Цитата Сообщение от castaway Посмотреть сообщение
Я тебе показал алгоритм с примером. Делай.
делаю, вот что получилось
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    vr normal(const vr & rhs)
    {
        vr norm;
        norm.first += rhs.second/60;
        norm.second = rhs.second%60;
        return norm;
    }
};
vr sum(vr x,vr y)
{
    vr temp;
    temp=x+y;
    cout<<"\n";
    temp.normal();
    return temp;
}
ругается на вызов функции normal

Добавлено через 5 минут
PS normal() находится в классе
Yandex
Объявления
21.06.2015, 23:12     Передача объекта в функцию
Ответ Создать тему
Опции темы

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