0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 25
1

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

21.06.2015, 21:31. Показов 2325. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
подскажите что тут не так у меня?!
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);
}
    
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2015, 21:31
Ответы с готовыми решениями:

Передача объекта в функцию или функцию друга
Здравствуйте, уважаемые программисты :) К примеру есть такой код. #include &lt;iostream&gt; using...

Передача объекта в функцию
Добрый день, такое дело, есть 2 класса , в функцию 2-го класса нужно передать объект 1-го в...

Передача объекта в функцию
Нужно передать в функцию void Openz(Array &amp;a) { int**buff = a.getarr(); for (int i(0); i...

Классы: передача объекта в функцию
class Distance // длина в английской системе { private: int feet; ...

20
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.06.2015, 21:37 2
Цитата Сообщение от kirill1904 Посмотреть сообщение
что тут не так у меня?!
Не хватает описания проблемы.
0
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:39  [ТС] 3
проблема с передачей в функцию, и сложении объектов
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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, обычно в таких случаях возвращается мусор.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.06.2015, 21:41 5
Передачей чего? В какую функцию? Каких объектов?
0
0 / 0 / 1
Регистрация: 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 также
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.06.2015, 21:45 7
Цитата Сообщение от kirill1904 Посмотреть сообщение
проблема со сложением 2х объектов
Цитата Сообщение от castaway Посмотреть сообщение
Каких объектов?
В чем проблема?
0
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:47  [ТС] 8
в функции main описано два объекта о1 и о2 вот их нужно сложить и записать в 3 объект temp
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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;
}
Всё это внутри класса.
1
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 21:57  [ТС] 10
Цитата Сообщение от castaway Посмотреть сообщение
В чем проблема?
в функции main описано два объекта о1 и о2 вот их нужно сложить и записать в 3 объект temp
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.06.2015, 21:59 11
Я уже понял.
1
0 / 0 / 1
Регистрация: 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 минут
заранее спасибо)
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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';
}
0
0 / 0 / 1
Регистрация: 29.09.2014
Сообщений: 25
21.06.2015, 22:27  [ТС] 14
Цитата Сообщение от hoggy Посмотреть сообщение
если выполнится первое условие, тогда сработает return 0;
что будет если оно не выполнится, и сработает ветка else ?
запуститься функция error();
а что будет дальше?
дальше мне не надо ничего, нужно было только сложить объекты и сделать их как время
0
Эксперт С++
8971 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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();
}
она должна вернуть наружу результат сложения.
но она так же ничего не возвращает.

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

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

сложили два временных объекта, получили мусор.
нормально чо.
0
0 / 0 / 1
Регистрация: 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 Посмотреть сообщение
она должна вернуть наружу результат сложения.
но она так же ничего не возвращает.
то бишь, здесь у вас точно такая же жЁпа.
вместо суммы вы будете получать случайный мусор.
сложили два временных объекта, получили мусор.
нормально чо.
это я исправил) спасибо
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
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;
}
0
0 / 0 / 1
Регистрация: 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;
}
да только надо это сделать в классе
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.06.2015, 22:58 19
Я тебе показал алгоритм с примером. Делай.
0
0 / 0 / 1
Регистрация: 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() находится в классе
0
21.06.2015, 23:12
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2015, 23:12
Помогаю со студенческими работами здесь

Передача объекта по указателю в функцию
Здравствуйте. При передаче объекта в метод другого объекта по указателю, метод получает непонятно...

Передача объекта в вызывающую функцию
Всем привет! Что-то меня переклинило, помогите. Задача в том, что в функции, вызванной из main(),...

Передача функционального объекта в функцию
Здорова! Никак не могу передать функциональный объект в функцию. От примерчик, функция...

Передача объекта класса в функцию С++
Всем привет! Возник вопрос по классам. Допустим мне нужно изменить объект класса через функцию...


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

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

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