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

С++ Конструктор копий. Функция, работающая с объектами - C++

Восстановить пароль Регистрация
 
supra7sky
 Аватар для supra7sky
15 / 15 / 1
Регистрация: 07.02.2013
Сообщений: 123
11.03.2013, 23:51     С++ Конструктор копий. Функция, работающая с объектами #1
Конструктор копий должен работать в след. ситуациях:
1) В объявлении объекта, когда один объект используется для инициализации другого.
2) Объект передается в ф-ю в качестве параметра
3) В качестве возвр. знач. создается временный объект

У меня проблема либо с конструктором копий, либо с дружественной функцией.
В результате мне вместо заданных мной данных выводится мусор. (Никаких ошибок компилятор не выводит)


Кусок класса:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class Machine
{
        //...
public:
    Machine  ();
    Machine  (int x);
    Machine  (const Machine &obj); //конструктор копий
    ~Machine ();
    void SET ();
    void GET ();
    friend Machine best (Machine OBJ_1, Machine OBJ_2); //ф-я должна возвращать объект
};
Определение конструктора копий и проблемной ф-ии:
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
Machine:: Machine  (const Machine &obj)
{
    id = new int;
    cost = new float;
    power = new float;
    weight = new float;
    top_speed = new float;
    acceleration = new float;
}
//
Machine best (Machine OBJ_1, Machine OBJ_2) //пункт 2) передается в ф-ю в качестве параметра
{
    int OB_1 = 0, OB_2 = 0;
 
        //простая арифметика (вырезал)
 
    if (OB_1 == OB_2) 
        return *OBJ_1.id < *OBJ_2.id ? OBJ_1 : OBJ_2;  //пункт 3) создается временный объект для возвр.  зн.
    else 
        return OB_1 > OB_2 ? OBJ_1 : OBJ_2;
}
//
int main ()
{
    int size;
    cout << "SIZE: ";   cin >> size;
    Machine *collection = new Machine[size];
 
    for (int i = 0; i < size; i++)
    {
        collection[i].SET(); cout << endl;
    }
    for (int i = 0; i < size; i++)
    {
        collection[i].GET(); cout << endl;
    }
 
    int ID_1, ID_2;
    cout << "How machine you like to compare? " << endl;
    cout << "1st ID: "; cin >> ID_1;
    cout << "2nd ID: "; cin >> ID_2;
 
    cout << endl << "The best machine is: " << endl;
    best ( collection[ID_1], collection[ID_2] ).GET(); //Вызов проблемной ф-ии. На экран выводится мусор
 
    system("pause");
    return 0;
}
Пожалуйста, напишите как правильно и если можно объясните почему так? Что я неправильно понял?
Весь код:

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
#include <iostream>
using namespace std;
 
class Machine
{
    int   *id;
    float *cost,
          *power,
          *weight,
          *top_speed,
          *acceleration;
public:
    Machine  ();
    Machine  (int x);
    Machine  (const Machine &obj);
    ~Machine ();
    void SET ();
    void GET ();
    friend Machine best (Machine OBJ_1, Machine OBJ_2);
};
Machine:: Machine  ()
{
    id = new int;
    cost = new float;
    power = new float;
    weight = new float;
    top_speed = new float;
    acceleration = new float;
}
Machine:: Machine  (int x)
{
    id = new int(x);
    cost = new float(x);
    power = new float(x);
    weight = new float(x);
    top_speed = new float(x);
    acceleration = new float(x);
}
Machine:: Machine  (const Machine &obj)
{
    id = new int;
    cost = new float;
    power = new float;
    weight = new float;
    top_speed = new float;
    acceleration = new float;
}
Machine:: ~Machine ()
{
    delete id;
    delete cost;
    delete power;
    delete weight;
    delete top_speed;
    delete acceleration;
}
void Machine::SET  ()
{
    cout << "ID: ";             cin >> *id;
    cout << "Cost: ";           cin >> *cost;
    cout << "Power: ";          cin >> *power;
    cout << "Weight: ";         cin >> *weight;
    cout << "Top speed: ";          cin >> *top_speed;
    cout << "Acceleration: ";       cin >> *acceleration;
}
void Machine::GET  ()
{
    cout << "ID: ";             cout << *id       << endl;
    cout << "Cost: ";           cout << *cost         << endl;
    cout << "Power: ";          cout << *power        << endl;
    cout << "Weight: ";         cout << *weight       << endl;
    cout << "Top speed: ";          cout << *top_speed        << endl;
    cout << "Acceleration: ";       cout << *acceleration     << endl;
}
Machine best (Machine OBJ_1, Machine OBJ_2)
{
    int OB_1 = 0, OB_2 = 0;
 
    if  (*OBJ_1.power > *OBJ_2.power)            OB_1++;
    else if (*OBJ_1.power < *OBJ_2.power)            OB_2++;
    if  (*OBJ_1.top_speed > *OBJ_2.top_speed)        OB_1++;
    else if (*OBJ_1.top_speed < *OBJ_2.top_speed)        OB_2++;
    if  (*OBJ_1.acceleration > *OBJ_2.acceleration)      OB_1++;
    else if (*OBJ_1.acceleration < *OBJ_2.acceleration)      OB_2++;
    if  (*OBJ_1.weight < *OBJ_2.weight)          OB_1++;
    else if (*OBJ_1.weight > *OBJ_2.weight)          OB_2++;
 
    if (OB_1 == OB_2) 
        return *OBJ_1.id < *OBJ_2.id ? OBJ_1 : OBJ_2;
    else 
        return OB_1 > OB_2 ? OBJ_1 : OBJ_2;
}
 
int main ()
{
    int size;
    cout << "SIZE: ";   cin >> size;
    Machine *collection = new Machine[size];
 
    for (int i = 0; i < size; i++)
    {
        collection[i].SET(); cout << endl;
    }
    for (int i = 0; i < size; i++)
    {
        collection[i].GET(); cout << endl;
    }
 
    int ID_1, ID_2;
    cout << "How machine you like to compare? " << endl;
    cout << "1st ID: "; cin >> ID_1;
    cout << "2nd ID: "; cin >> ID_2;
 
    cout << endl << "The best machine is: " << endl;
    best ( collection[ID_1], collection[ID_2] ).GET();
 
    system("pause");
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.03.2013, 00:16     С++ Конструктор копий. Функция, работающая с объектами #2
Конструктор копий ничего не копирует, аргументы в best по ссылке бы передавать надо.
supra7sky
 Аватар для supra7sky
15 / 15 / 1
Регистрация: 07.02.2013
Сообщений: 123
12.03.2013, 01:21  [ТС]     С++ Конструктор копий. Функция, работающая с объектами #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
Конструктор копий ничего не копирует, аргументы в best по ссылке бы передавать надо.
Почему не копирует?
По ссылкам можно и без конструктора копий, но задача именно такая. Параметры - объекты, возвр. значение - объект.

Добавлено через 54 минуты
Допёр. Конструктор к. не инициализировал элементы, но по сути все работало.
(Делал по шаблону, а не по примеру ==> ошибка)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Machine:: Machine  (const Machine &obj)
{
    id = new int;
    *id = *obj.id;
    cost = new float;
    *cost = *obj.cost;
    power = new float;
    *power = *obj.power;
    weight = new float;
    *weight = *obj.weight;
    top_speed = new float;
    *top_speed = *obj.top_speed;
    acceleration = new float;
    *acceleration = *obj.acceleration;
}
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
12.03.2013, 01:39     С++ Конструктор копий. Функция, работающая с объектами #4
Кое что подправил, попробуйте:
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
#include <iostream>
using namespace std;
 
class Machine
{
    int   *id;
    float *cost,
          *power,
          *weight,
          *top_speed,
          *acceleration;
public:
    Machine  ();
    Machine  (int x);
    Machine  (const Machine &obj);
    ~Machine ();
    void SET ();
    void GET () const;
    friend  const Machine& best (const Machine& OBJ_1, const Machine& OBJ_2);
};
Machine:: Machine  ()
{
    id = new int;
    cost = new float;
    power = new float;
    weight = new float;
    top_speed = new float;
    acceleration = new float;
}
Machine::Machine  (const int x)
{
    id = new int(x);
    cost = new float(x);
    power = new float(x);
    weight = new float(x);
    top_speed = new float(x);
    acceleration = new float(x);
}
Machine:: Machine  (const Machine &obj)
{
    id = new int(*obj.id);
    cost = new float(*obj.cost);
    power = new float(*obj.power);
    weight = new float(*obj.weight);
    top_speed = new float(*obj.top_speed);
    acceleration = new float(*obj.acceleration);
}
Machine:: ~Machine ()
{
    delete id;
    delete cost;
    delete power;
    delete weight;
    delete top_speed;
    delete acceleration;
}
void Machine::SET  ()
{
    cout << "ID: ";             cin >> *id;
    cout << "Cost: ";           cin >> *cost;
    cout << "Power: ";          cin >> *power;
    cout << "Weight: ";         cin >> *weight;
    cout << "Top speed: ";      cin >> *top_speed;
    cout << "Acceleration: ";   cin >> *acceleration;
}
void Machine::GET  () const
{
    cout << "ID: ";             cout << *id       << endl;
    cout << "Cost: ";           cout << *cost         << endl;
    cout << "Power: ";          cout << *power        << endl;
    cout << "Weight: ";         cout << *weight       << endl;
    cout << "Top speed: ";      cout << *top_speed        << endl;
    cout << "Acceleration: ";   cout << *acceleration     << endl;
}
const Machine& best (const Machine& OBJ_1, const Machine& OBJ_2)
{
    int OB_1 = 0, OB_2 = 0;
 
    if  (*OBJ_1.power > *OBJ_2.power)            OB_1++;
    else if (*OBJ_1.power < *OBJ_2.power)            OB_2++;
    if  (*OBJ_1.top_speed > *OBJ_2.top_speed)        OB_1++;
    else if (*OBJ_1.top_speed < *OBJ_2.top_speed)        OB_2++;
    if  (*OBJ_1.acceleration > *OBJ_2.acceleration)      OB_1++;
    else if (*OBJ_1.acceleration < *OBJ_2.acceleration)      OB_2++;
    if  (*OBJ_1.weight < *OBJ_2.weight)          OB_1++;
    else if (*OBJ_1.weight > *OBJ_2.weight)          OB_2++;
 
    if (OB_1 == OB_2) 
        return (*OBJ_1.id < *OBJ_2.id) ? OBJ_1 : OBJ_2;
    else 
        return (OB_1 > OB_2) ? OBJ_1 : OBJ_2;
}
 
int main ()
{
    int size;
    cout << "SIZE: ";   cin >> size;
    Machine *collection = new Machine[size];
 
    for (int i = 0; i < size; i++)
    {
        collection[i].SET(); cout << endl;
    }
    for (int i = 0; i < size; i++)
    {
        collection[i].GET(); cout << endl;
    }
 
    int ID_1, ID_2;
    cout << "How machine you like to compare? " << endl;
    cout << "1st ID: "; 
    while (!(cin >> ID_1) || ID_1 >= size)
    {
        std::cout<<"Enter again: ";
        if (!cin) {cin.clear(); cin.sync();}
    }
    cout << "2nd ID: ";
    while (!(cin >> ID_2) || ID_2 >= size)
    {
        std::cout<<"Enter again: ";
        if (!cin) {cin.clear(); cin.sync();}
    }
   
    cout << endl << "The best machine is: " << endl;
    best (collection[ID_1], collection[ID_2]).GET();
 
    system("pause");
    return 0;
}
supra7sky
 Аватар для supra7sky
15 / 15 / 1
Регистрация: 07.02.2013
Сообщений: 123
12.03.2013, 01:44  [ТС]     С++ Конструктор копий. Функция, работающая с объектами #5
Да, как раз с инициализацией и тормознул. Спасибо))
Yandex
Объявления
12.03.2013, 01:44     С++ Конструктор копий. Функция, работающая с объектами
Ответ Создать тему
Опции темы

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