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

Конструктор копирование - C++

Восстановить пароль Регистрация
 
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
21.06.2011, 13:59     Конструктор копирование #1
Получил задание от преподавателя написать программу «Поезд»

Условия такие программа предлагает ввести с клавиатуры:
-Количество поездов;
-Количество вагонов для каждого поезда;
На основе ведомых данных создается поезда и выводится общая информация о них.

Также система должна выдавать следующие отчеты:
1. Поезд в котором ехала наибольшее количество пассажиров.
2. Поезд в котором ехала наименьшее количество пассажиров.
3. Для каждого поезда выводится следующая информация:
а) Общее количество пассажиров.
в) Общее количество вагонов.
г) Номер вагона в котором ехала наименьшее количество пассажиров
д) Номер вагона в котором ехала наибольшее количество пассажиров

Ход решения задачи:
1. Необходимо создать класс «поезд»
который должен содержать следующие поля:
а) номер поезда;
б) название поезда (соединение например «Львов - Киев»);
в) (поле вагон) указатель на тип int, которому будет выделяться динамическая
память размером в число вагонов, где индекс данного массива указывает
на номер вагона, а значение ячейки массива на количество пассажиров в
вагоне;
г) количество вагонов.

который должен содержать следующие методы:
- Конструктор по умолчанию;
- Конструктор с параметрами;
- Конструктор копирования;
- Деструктор;
- Методы для установки значений в поля класса (set - методы);
- Методы для получения значений из полей класса (get - методы);
- Метод для вывода полей класса на консоль (информации о поезде).
- Метод для поиска максимального элемента поля (вагон);
- Метод для поиска минимального элемента поля (вагон);
- Метод для поиска суммы значений элементов поля (вагон);

Проблема в том что я не разберусь с конструктором копирования куда его впихнуть по моему он тут не нужен
моя программа
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 <iostream>
#include <windows.h>
#include<time.h>
using namespace std;
class CTrain
{
public:
    CTrain()
    {
        ID=NULL;
        train=NULL;
        car=NULL;
        passengers=NULL;
    }
    void Set (char *train1,int car1,int ID1)
    {
        srand(time(NULL));
        ID=ID1;
        train=new char [strlen(train1)+1];
        strcpy(train,train1);
        msize=car1;
        car=new int [car1];
        for (int i=0;i<car1;i++)
        {
            *(car+i)=rand()%50;
        }
    }
    void Show()
    {
        cout<<"Поезд №"<<ID<<endl;
        cout<<"Название поезда:"<<train<<endl;
        for (int i=0;i<msize;i++)
        {
            cout<<"Вогон №"<<i+1<<" Пасажиров:"<<car[i]<<endl;
        }
    }
private:
    int ID;
    int msize;
    char *train;
    int *car;
    int passengers;
};
void main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    int key=NULL;
    int size=NULL;
    char train[20];
    int car=NULL;
    cout<<"Введите количество поездов:";
    cin>>size;
    CTrain *Train=new CTrain [size];
    for (int i=0;i<size;i++)
    {
        cout<<"Введите название поезда:";
        cin.ignore();
        cin.getline(train,20);
        cout<<"Введите количество вогонов:";
        cin>>car;
        Train[i].Set(train,car,i+1);
    }
    do
    {
        cout<<"1.Информация о поездах"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                for (int i=0;i<size;i++)
                {
                    Train[i].Show();
                }   
            }break;
        }
    }while(key!=0);
}
Прошу Вас помочь мне разобраться с конструктором копированием как его использовать и в моей задачи или покажите примеры с конструкторами копированием
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2011, 13:59     Конструктор копирование
Посмотрите здесь:

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) C++
Будет ли работать должным образом конструктор копирование с указателем? C++
C++ Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
C++ Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
C++ Зачем возвращать конструктор копирование?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
asics
Freelance
Эксперт C++
 Аватар для asics
2838 / 1775 / 144
Регистрация: 09.09.2010
Сообщений: 3,842
21.06.2011, 14:00     Конструктор копирование #2
Не вижу вопросов.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.06.2011, 14:02     Конструктор копирование #3
тема называется
Конструктор копирование
, так где все остальное?
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
21.06.2011, 14:05     Конструктор копирование #4
Цитата Сообщение от DigsiL Посмотреть сообщение
Проблема в том что я не разберусь с конструктором копирования его впихнуть по моему он тут не нужен
нужен:
Цитата Сообщение от DigsiL Посмотреть сообщение
указатель на тип int, которому будет выделяться динамическая
память размером в число вагонов
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
21.06.2011, 14:11  [ТС]     Конструктор копирование #5
Цитата Сообщение от pito211 Посмотреть сообщение
нужен:
НЕ понимаю как пользоваться конструкторам копирования если я и без него могу сделать задачу
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.06.2011, 14:28     Конструктор копирование #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
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
#include <iostream>
#include <cstring>
#include <ctime>
 
class CTrain {
public:
    CTrain()
    {
    ID = 0;
           train = NULL;
           car = NULL;
    }
    
    CTrain(const CTrain & other)
    {
    this->ID = other.ID;
    this->msize = other.msize;
    this->train = new char [strlen(other.train) + 1];
    this->car = new int [msize];
    strcpy(this->train, other.train); 
    memcpy(this->car, other.car, msize * sizeof(int));
    }
 
    ~CTrain()
    {
            if(this->car)
            delete [] this->car;
    if(this->train)
        delete [] this->train;
    }
 
    void Set (const char * train1, int car1, int ID)
    {
            this->ID = ID;
           train = new char [strlen(train1)+1];
           strcpy(train,train1);
           msize = car1;
           car = new int [car1];
           for (int i = 0; i < car1; i++)
           {
        car[i] = rand() % 50;
           }
    }
 
    void Show()
    {
           std::cout << "Поезд №" << ID << '\n';
           std::cout<< "Название поезда:" << train << '\n';
           for(int i = 0; i < msize; i++)
    {
          std::cout << "Вогон №" << i + 1 << " Пасажиров:" << car[i] << '\n';
    }
    }
private:
    int ID;
    int msize;
    char * train;
    int * car;
};
 
int main ()
{
    std::locale::global(std::locale(""));
    srand((unsigned)time(NULL));
    int key = 0, size = 0, car = 0;
    char train[20];
    std::cout << "Введите количество поездов: ";
    std::cin >> size;
    CTrain * Train = new CTrain [size];
    for (int i = 0; i < size; i++)
    {
         std::cout << "Введите название поезда: ";
         std::cin.ignore();
         std::cin.getline(train, 20);
         std::cout << "Введите количество вогонов: ";
         std::cin >> car;
         Train[i].Set(train, car, i + 1);
        }
        do
        {
                std::cout<<"1.Информация о поездах"<<endl;
                std::cin>>key;
                switch (key)
                {
                case 1:
        for (int i=0;i<size;i++)
                           Train[i].Show();
                    break;
                }
        }while(key!=0);
    return 0;
}
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
21.06.2011, 14:38     Конструктор копирование #7
Цитата Сообщение от DigsiL Посмотреть сообщение
НЕ понимаю как пользоваться конструкторам копирования если я и без него могу сделать задачу
рабочую программу ты без него сделать не сможешь
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
21.06.2011, 14:57  [ТС]     Конструктор копирование #8
Цитата Сообщение от pito211 Посмотреть сообщение
рабочую программу ты без него сделать не сможешь
Блин ну вопще не пойму смысол конструктора вот программа без конструктора

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
#include <iostream>
#include <windows.h>
#include<time.h>
using namespace std;
class CTrain
{
public:
    CTrain()
    {
        ID=NULL;
        train=NULL;
        car=NULL;
    }
 
 
    void Set (char *train,int size,int ID)
    {
        this->ID=ID;
        this->train=new char [strlen(train)+1];
        strcpy(this->train,train);
        this->size=size;
        car=new int [size];
        for (int i=0;i<size;i++)
        {
            car[i]=rand()%50;
        }
    }
    void Show()
    {
        cout<<"Поезд №"<<ID<<endl;
        cout<<"Название поезда:"<<train<<endl;
        for (int i=0;i<size;i++)
        {
            cout<<"Вогон №"<<i+1<<" Пасажиров:"<<car[i]<<endl;
        }
    }
    ~CTrain ()
    {
        cout<<"~"<<endl;
        delete []train;
        delete []car;
    }
private:
    int ID;
    int size;
    char *train;
    int *car;
};
void main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    int key=0;
    int size=0;
    int car=0;
    char train[20];
 
    cout<<"Введите количество поездов:";
    cin>>size;
 
    CTrain *Train=new CTrain [size];
    for (int i=0;i<size;i++)
    {
        cout<<"Введите название поезда:";
        cin.ignore();
        cin.getline(train,20);
        cout<<"Введите количество вогонов:";
        cin>>car;
        Train[i].Set(train,car,i+1);
    }
    system("cls");
 
    do
    {
        cout<<"1.Информация о поездах"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                for (int i=0;i<size;i++)
                {
                    Train[i].Show();
                }   
            }break;
        }
    }while(key!=0);
    delete []Train;
}
А вот с конструкторам копирования
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
#include <iostream>
#include <windows.h>
#include<time.h>
using namespace std;
class CTrain
{
public:
    CTrain()
    {
        ID=NULL;
        train=NULL;
        car=NULL;
    }
    CTrain(const CTrain & temp)
    {
        this->ID=temp.ID;
        this->size=temp.size;
        this->train=new char [strlen(temp.train)+1];
        strcpy(this->train,train);
        this->car=new int [size];
    }
 
    void Set (char *train,int size,int ID)
    {
        this->ID=ID;
        this->train=new char [strlen(train)+1];
        strcpy(this->train,train);
        this->size=size;
        car=new int [size];
        for (int i=0;i<size;i++)
        {
            car[i]=rand()%50;
        }
    }
    void Show()
    {
        cout<<"Поезд №"<<ID<<endl;
        cout<<"Название поезда:"<<train<<endl;
        for (int i=0;i<size;i++)
        {
            cout<<"Вогон №"<<i+1<<" Пасажиров:"<<car[i]<<endl;
        }
    }
    ~CTrain ()
    {
        cout<<"~"<<endl;
        delete []train;
        delete []car;
    }
private:
    int ID;
    int size;
    char *train;
    int *car;
};
void main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    int key=0;
    int size=0;
    int car=0;
    char train[20];
 
    cout<<"Введите количество поездов:";
    cin>>size;
 
    CTrain *Train=new CTrain [size];
    for (int i=0;i<size;i++)
    {
        cout<<"Введите название поезда:";
        cin.ignore();
        cin.getline(train,20);
        cout<<"Введите количество вогонов:";
        cin>>car;
        Train[i].Set(train,car,i+1);
    }
    system("cls");
 
    do
    {
        cout<<"1.Информация о поездах"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                for (int i=0;i<size;i++)
                {
                    Train[i].Show();
                }   
            }break;
        }
    }while(key!=0);
    delete []Train;
}
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.06.2011, 15:02     Конструктор копирование #9
Цитата Сообщение от DigsiL Посмотреть сообщение
А вот с конструкторам копирования
ну и, память под вагоны ты выделил, а кто значения(пассажиров) копировать будет? зачем убрал memcpy?

Добавлено через 1 минуту
1. форматируйте код по-людски, с отступами между операторами
2. функция main должна возвращать значение
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
21.06.2011, 15:13  [ТС]     Конструктор копирование #10
Цитата Сообщение от Maxwe11 Посмотреть сообщение
ну и, память под вагоны ты выделил, а кто значения(пассажиров) копировать будет? зачем убрал memcpy?

Добавлено через 1 минуту
1. форматируйте код по-людски, с отступами между операторами
2. функция main должна возвращать значение
Память под вагоны выделена
C++
1
2
3
4
5
6
7
8
9
10
11
12
    void Set (char *train,int size,int ID)
    {
        this->ID=ID;
        this->train=new char [strlen(train)+1];
        strcpy(this->train,train);
        this->size=size;
        car=new int [size];
        for (int i=0;i<size;i++)
        {
            car[i]=rand()%50;
        }
    }
а кто значения(пассажиров) копировать будет?
А и так все чудесно копируется
C++
1
2
3
4
        for (int i=0;i<size;i++)
        {
            car[i]=rand()%50;
        }
зачем убрал memcpy?

Я не изучал эту функцию и не знаю для чего она мне ((

1. форматируйте код по-людски, с отступами между операторами
2. функция main должна возвращать значение
1. Где отступать???
2.А смысл какой ???
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.06.2011, 15:16     Конструктор копирование #11
Цитата Сообщение от DigsiL Посмотреть сообщение
а кто значения(пассажиров) копировать будет?
я говорю про констуктор копирования, а не про метод Сет

Цитата Сообщение от DigsiL Посмотреть сообщение
Я не изучал эту функцию и не знаю для чего она мне ((
ну так если не знаете, так посмотрите(google.ru), не просто так же я ее поставил

Цитата Сообщение от DigsiL Посмотреть сообщение
1. Где отступать???
издеваешься? сравни свой код с моим, епт

Цитата Сообщение от DigsiL Посмотреть сообщение
2.А смысл какой ???
тема неоднократно подымалась на форуме и в интернетах, google.ru в помощь
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
21.06.2011, 15:21     Конструктор копирование #12
DigsiL, 2) По стандарту положено.
Запомните, если класс работает с памятью - он обязан иметь конструктор копирования. Исключения есть, но их мало.
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
21.06.2011, 15:22     Конструктор копирование #13
Цитата Сообщение от DigsiL Посмотреть сообщение
for (int i=0;i<size;i++)
{
car[i]=rand()%50;
}
где тут копирование? Массив заполняется случайными числами, никакого копирования не видать. Без конструктора копирования и оператора присваивания класс не будет работать с контейнерами
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2011, 16:04     Конструктор копирование
Еще ссылки по теме:

C++ Конструктор копирование у наследника
C++ Создать класс. Написать конструктор по умолчанию, конструктор с параметрами. Перегрузить операции «меньше» и «равно»
C++ Будет ли определен компилятором конструктор по умолчанию, если есть конструктор с дефолтным параметром?

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

Или воспользуйтесь поиском по форуму:
DigsiL
9 / 9 / 1
Регистрация: 14.01.2011
Сообщений: 113
21.06.2011, 16:04  [ТС]     Конструктор копирование #14
Блин что та не пойму вот программа которая использует конструктор копирования
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
#include <iostream>
using namespace std;
class A
{
public:
    A(int size)
    {
        mpt=new int [size];
        msize=size;
        for (int i=0;i<size;i++)
        {
            *(mpt+i)=i+10;
        }
    }
    void Show()
    {
        for (int i=0;i<msize;i++)
        {
            cout<<mpt[i]<<endl;
        }
    }
    A(const A & temp)
    {
        mpt=new int [temp.msize];
        msize=temp.msize;
        for (int i=0;i<msize;i++)
        {
            mpt[i]=temp.mpt[i];
        }
    }
    ~A()
    {
        cout<<"~A()"<<endl;
        delete []mpt;
    }
private:
    int msize;
    int *mpt;
};
void Print (A a)
{
    a.Show();
}
void main ()
{
    A a(5);
    Print(a);
}
Вроде и моя аналогична ей но при исследование отладчиком конструктор копирование не задействован помогите разобраться в чем проблема ?
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
#include <iostream>
#include <windows.h>
#include <time.h>
using namespace std;
class CTrain
{
public:
    CTrain()
    {
        ID=NULL;
        train=NULL;
        car=NULL;
    }
    CTrain(const CTrain & temp)
    {
        this->ID=temp.ID;
        this->size=temp.size;
        this->train=new char [strlen(temp.train)+1];
        strcpy(this->train,train);
        this->car=new int [size];
    }
 
    void Set (char *train,int size,int ID)
    {
        this->ID=ID;
        this->train=new char [strlen(train)+1];
        strcpy(this->train,train);
        this->size=size;
        car=new int [size];
        for (int i=0;i<size;i++)
        {
            car[i]=rand()%50;
        }
    }
    void Show()
    {
        cout<<"Поезд №"<<ID<<endl;
        cout<<"Название поезда:"<<train<<endl;
        for (int i=0;i<size;i++)
        {
            cout<<"Вогон №"<<i+1<<" Пасажиров:"<<car[i]<<endl;
        }
    }
    ~CTrain ()
    {
        cout<<"~"<<endl;
        delete []train;
        delete []car;
    }
private:
    int ID;
    int size;
    char *train;
    int *car;
};
 
void Print (CTrain *Train1,int size)
{
    for (int i=0;i<size;i++)
    {
        Train1[i].Show();
    }
}
void main ()
{
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);
    int key=0;
    int size=0;
    int car=0;
    char train[20];
 
    cout<<"Введите количество поездов:";
    cin>>size;
 
    CTrain *Train=new CTrain [size];
    for (int i=0;i<size;i++)
    {
        cout<<"Введите название поезда:";
        cin.ignore();
        cin.getline(train,20);
        cout<<"Введите количество вогонов:";
        cin>>car;
        Train[i].Set(train,car,i+1);
    }
    system("cls");
 
    do
    {
        cout<<"1.Информация о поездах"<<endl;
        cin>>key;
        switch (key)
        {
        case 1:
            {
                for (int i=0;i<size;i++)
                {
                    Train[i].Show();
                }   
            }break;
        case 2:
            {
                Print(Train,size);
            }
        }
    }while(key!=0);
    delete []Train;
}
Yandex
Объявления
21.06.2011, 16:04     Конструктор копирование
Ответ Создать тему
Опции темы

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