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

Классы (константный метод и перезагрузка оператора равно) - C++

Восстановить пароль Регистрация
 
Любимая
 Аватар для Любимая
67 / 2 / 4
Регистрация: 22.04.2011
Сообщений: 84
30.11.2013, 15:40     Классы (константный метод и перезагрузка оператора равно) #1
ПОМОГИТЕ ПОЖАЛУЙСТА, ЧТО НЕ ТАК???!!!! илл как тогда сделать правильно????
Очень очень надо((
Дано было задание:
1)Создать класс
2) создать конструктор
3) счетчик
4) статисчтический метод
5) константный метод
6) перезагрузку оператора равно
Вот что получилось до константного метода:

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
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
    int year = 2013;
    class Crabotnik
    {   public:
    int date;//поступление
    static int count;
                    int calckvl()
        {
            return year - date;
        }
    
                Crabotnik( int date = 1)
        {
            this->date = date;count++;
        }
            Crabotnik (Crabotnik & RP)
            { this->date = RP.date;
count++;            }
        };
    
    
    int Crabotnik::count = 0;
    int main(){
        
        
        Crabotnik P1(1991);
        cout << "rabotnik 1" << endl;
        cout << "ivan" << ' ';
        cout << "vasilivish"<<' ';
        cout << P1.date << ' ';
        cout << "solist"<<' ';
        cout << "srage" << P1.calckvl() << endl;
 
        Crabotnik P2( P1);
        cout << "rabotnik 2" << endl;
        cout << "sergey" << ' ';
        cout << "sergeevish"<<' ';
        cout << "artist chor" << ' ';
        cout << P2.date << ' ';
                cout <<"stage"<< P2.calckvl() << endl;
                //cout << P1.count;
                cout << "kol-vo"<<Crabotnik::count;
    _getch();
    return 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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
    int year = 2013;
                    class Pens //пенсия
                    {public:
                    Pens(){t=0;}
                    void setValue(int val){t=val;}
                    int getValue() const
                    {return t;}
                    private: int t;};
                    class CZp
                    {public:static int m;};
    class Crabotnik
    {   public:
    int date;//поступление
    static int count;
                    int calckvl()
        {
            return year - date;
        }
    
                Crabotnik( int date = 1)
        {
            this->date = date;count++;
        }
            Crabotnik (Crabotnik & RP)
            { this->date = RP.date;
count++;            }
        void operator=(CRabotnik RP)
                  {this->date=RP.date;}
        };
    
        int CZp::m=20000;
        CZp zp1;
        CZp zp2;
        CZp zp3;
    int Crabotnik::count = 0;
    int main(){
        
        
        Crabotnik P1(1991);
        Crabotnik P2(1980);
        Crabotnik P3(P1);
        CRabotnik P4=P2;
        
        cout << "rabotnik 1" << endl;
        cout << "ivan" << ' ';
        cout << "vasilivish"<<' ';
        cout << P1.date << ' ';
        cout << "solist"<<' ';
        cout << "stage" << P1.calckvl() << endl;
cout << "zarplata: "<<zp1.m <<endl; 
 
        
        cout << "rabotnik 2" << endl;
        cout << "sergey" << ' ';
        cout << "sergeevish"<<' ';
        cout << "artist chor" << ' ';
        cout << P2.date << ' ';
                cout <<"stage"<< P2.calckvl() << endl;
cout << "zarplata: "<<zp2.m <<endl;
                
 
 
                
 
   cout <<"P3 date "<<P3.date<<endl;
   cout <<"P4 date.date<<endl;
   Pens pens;
   pens.setValue(60);
   cout<<"pensionniy vozrast "<<pens.getValue()<<endl;
 
getch();
return 1;}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.11.2013, 15:48     Классы (константный метод и перезагрузка оператора равно) #2
Цитата Сообщение от Любимая Посмотреть сообщение
перезагрузку оператора
Что такое перезагрузка оператора?
Jupiter
30.11.2013, 15:49
  #3

Не по теме:

Цитата Сообщение от Любимая Посмотреть сообщение
Crabotnik
Цитата Сообщение от Любимая Посмотреть сообщение
Pens pens;
Cramota

Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
01.12.2013, 09:08     Классы (константный метод и перезагрузка оператора равно) #4
1. Поправь строки 34 и 49. У тебя вместо Crabotnik написано CRabotnik.
2. Поправь кавычки в строке 73.
3 (главное). Перегруженный оператор = должен возвращать объект Crabotnik. Вместо этого он у тебя ничего не возвращает.

Вот этот код заработал:
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
#include <iostream>
#include <stdio.h>
#include <conio.h>
 
using namespace std;
 
int year = 2013;
 
class Pens //пенсия
{
public:
    Pens()
    {
        t=0;
    }
    
    void setValue(int val)
    {
        t=val;
    }
    int getValue() const
    {
        return t;
    }
                    
private: 
    int t;
};
                    
class CZp
{
public:
    static int m;
};
    
class Crabotnik
{   
public:
    int date;//поступление
    static int count;
 
    int calckvl()
    {
        return year - date;
    }
    
    Crabotnik(int date)
    {
        this->date = date;
        count++;
    }
 
    Crabotnik(Crabotnik& RP)
    {
        this->date = RP.date;
        count++;            
    }
        
    Crabotnik operator=(Crabotnik RP)
    {
        this->date = RP.date;
        return *this;
    }
};
    
int CZp::m=20000;
CZp zp1;
CZp zp2;
CZp zp3;
    
int Crabotnik::count = 0;
 
int main()
{
    Crabotnik P1(1991);
    Crabotnik P2(1980);
    Crabotnik P3(P1);
    Crabotnik P4 = P2;
        
    cout << "rabotnik 1" << endl;
    cout << "ivan" << ' ';
    cout << "vasilivish"<< ' ';
    cout << P1.date << ' ';
    cout << "solist"<< ' ';
    cout << "stage" << P1.calckvl() << endl;
    cout << "zarplata: "<< zp1.m << endl; 
     
    cout << "rabotnik 2" << endl;
    cout << "sergey" << ' ';
    cout << "sergeevish" <<' ';
    cout << "artist chor" << ' ';
    cout << P2.date << ' ';
    cout << "stage" << P2.calckvl() << endl;
    cout << "zarplata: "<< zp2.m <<endl;
    
    cout << "P3 date " << P3.date << endl;
    cout << "P4 date " << P4.date << endl;
 
    Pens pens;
    pens.setValue(60);
    cout << "pensionniy vozrast " << pens.getValue() << endl;
    
    _getch();
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.12.2013, 11:25     Классы (константный метод и перезагрузка оператора равно) #5
Brain_Dead, насчет того, что должен возвращать оператор равно. Во-первых, если по правилам, он должен возвращать ссылку. Ссылка нужна, чтобы работали выражения вроде a=b=c.
Во-вторых, если такие двойные равенства тебе не принципиальны, оператор равно может смело возвращать void.
Brain_Dead
 Аватар для Brain_Dead
9 / 8 / 2
Регистрация: 25.09.2013
Сообщений: 34
01.12.2013, 12:06     Классы (константный метод и перезагрузка оператора равно) #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Brain_Dead, насчет того, что должен возвращать оператор равно. Во-первых, если по правилам, он должен возвращать ссылку. Ссылка нужна, чтобы работали выражения вроде a=b=c.
Во-вторых, если такие двойные равенства тебе не принципиальны, оператор равно может смело возвращать void.
Согласен

Добавлено через 7 минут
Правда, можно уточнить: выражение типа a = b = c работает и с возвратом по значению (проверял). С ним не работает ++++ (проверял; книжка Мартынова).

С возвратом void a = b = c действительно не работает.

Добавлено через 5 минут
Вообще, если я правильно понял, классы обычно возвращают и передают по ссылкам, чтобы не копировать объекты больших размеров.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.12.2013, 13:34     Классы (константный метод и перезагрузка оператора равно)
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
01.12.2013, 13:34     Классы (константный метод и перезагрузка оператора равно) #7
Цитата Сообщение от Brain_Dead Посмотреть сообщение
a = b = c работает и с возвратом по значению (проверял)
ну тогда можно проверить (a=b)=c;
конкретно в таком порядке без возврата ссылки не обойтись, думаю. (a=b) будет lvalue только если вернёт ссылку на корректный объект

Добавлено через 26 минут
Вот пример неправильно перегруженного оператора =
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
#include <iostream>
class test{
    int* ptr;
   public:
       test()                {ptr=new int(0);}
       test(int arg)         {ptr=new int(arg);}
       test(const test& copy){ptr=new int(copy.get());}
       int get()const        {return *ptr;}
       void print_addr()const{std::cout<<"addr: "<<ptr<<std::endl; }
       /*test& operator=(const test& copy){//правильный оператор
           if (this!=&copy) *ptr=copy.get();
           return *this;
       }
       void operator=(const test& copy){//неправильный оператор, если хочешь скомпилировать a=b=c
                                                   //в остальных случаях нормально прокатит.
           if (this!=&copy) *ptr=copy.get();
       }*/
       
       test operator=(const test& copy){//проверяем такой оператор =
           if (this!=&copy) *ptr=copy.get();
           return *this;
       }
       
       ~test()               {delete ptr;}
};
int main() {
    test a(0), b(0), c(5);
    std::cout<<"operator = demo. Operator= must copy only values. Each ptr must keep pointing to individual address"<<std::endl;
    std::cout<<"a, b, c, addresses before:"<<std::endl;
    a.print_addr();
    b.print_addr();
    c.print_addr();
    (a=b)=c;
    std::cout<<"a, b, c, addresses after:"<<std::endl;
    a.print_addr();
    b.print_addr();
    c.print_addr();
    std::cout<<"addresses are OK, but..."<<std::endl;
    std::cout<<"a, b, c, values after:"<<std::endl;
    std::cout<<a.get()<<" "<<b.get()<<" "<<c.get()<<std::endl;
    std::cout<<"Expected x, y, z behaviour:"<<std::endl;
    int x=0, y=0, z=5;
    (x=y)=z;
    std::cout<<"x="<<x<<" y="<<y<<" z="<<z<<std::endl;
    return 0;
}
Yandex
Объявления
01.12.2013, 13:34     Классы (константный метод и перезагрузка оператора равно)
Ответ Создать тему
Опции темы

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