Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
1

Создать конструктор копирования класса

27.09.2014, 17:27. Просмотров 1882. Ответов 32
Метки нет (Все метки)

Помогите создать конструктор копирования класса. Мне надо чтоб я в основной программе нажимал кнопку и она копировала введенные мной данные и сново, пока я не прикращу нажимать. Код основной программы я не кидаю, там фигня. А вот класс и первый мною написанный конструктор копирования кину.
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
//prog2.h
#include <cmath>
#include <stdio.h>
#pragma once
class Triangle
{
private:
    char *name[31];
    struct point {
        int x;
        int y;
    } *coordinates;
    double stores[3];
    double area = 0, p = 0;
public:
    void set()
    {
        printf("Name: \n");
        scanf("%s", &name);
        coordinates = new point[3];
        for (int i = 0; i < 3; i++)
        {
 
            do
            {
                printf("Enter the coordinates of the %d vertices  : \n", i + 1);
                if (scanf("%d", &coordinates[i].x) && scanf("%d", &coordinates[i].y))
                    break;
                else
                {
                    printf("Error!\n");
                    clearerr(stdin);
                    while (getchar() != '\n');
                }
            } while (true);
        }
        for (int i = 0; i < 3; i++) {
            stores[i] = sqrt(double(coordinates[i].x*coordinates[i].x + coordinates[i].y*coordinates[i].y));
            //printf("Длина стороны №%d = %lf\n", i + 1, stores[i]);
            p += stores[i];
        }
        area = sqrt((p / 2)*(p / 2 - stores[0])*(p / 2 - stores[1])*(p / 2 - stores[2]));
    }
    void show(){
        printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 0xDA, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xBF);
        printf("%c Name:                           %c\n", 0xB3, 0xB3);
        printf("%c%-33s%c\n", 0xB3, &name, 0xB3);
        printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 0xC3, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xB4);
        printf("%c Coordinates:                    %c\n", 0xB3, 0xB3);
        for (int i = 0; i < 3; i++)
        {
            printf("%c              x= %d; y= %d         %c\n", 0xB3, coordinates[i].x, coordinates[i].y, 0xB3);
        }
        printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 0xC3, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xB4);
        printf("%c Length:                         %c\n", 0xB3, 0xB3);
        for (int i = 0; i < 3; i++) {
            printf("%c length of the side N%d = %lf%c\n", 0xB3, i + 1, stores[i], 0xB3);
        }
        printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 0xC3, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xB4);
        printf("%c Area:                           %c\n", 0xB3, 0xB3);
        printf("%c    area of a triangle = %lf%c\n", 0xB3, area, 0xB3);
        printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", 0xC0, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xC4, 0xD9);
    }
};
class Copy{
public:
    Triangle *tr;
    Copy(){
        tr = new Triangle;
    }
    // Конструктор копирования.        
    Copy(const Triangle & area){
        this->tr = new Triangle;
        this->tr->area = area.tr->&area; Вот тут уже ошибки. Я написал только для одного метода.
    }
 
};
Я написал конструктор только для 1 метода из 4. Помогите, а то я особо не понимаю в этих конструкторах. Заранее спасибо.

Добавлено через 5 минут
Насколько я понимаю конструктор должен копировать только метод show(). Я там вивожу значения.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.09.2014, 17:27
Ответы с готовыми решениями:

Конструктор класса, конструктор копирования запускается не тот который нужен
Есть такой конструктор: Neuron::Neuron(int iType_activation_funk) { this-&gt;iType_act =...

Создать конструктор копирования для класса "Прямоугольник"
Всем привет! Помогите разобраться, пожалуйста! Есть такое задание: Определить класс...

Конструктор копирования шаблонного класса
Всем доброго времени суток! Язык С++ изучаю относительно недавно и столкнулся с задачей, которую не...

Конструктор копирования для шаблонного класса
Не могу написать конструктор копирования для следующего класса: template &lt;typename T, typename A =...

32
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 18:22 2
C++
1
2
3
4
5
6
// Конструктор копирования.        
    Copy(const Copy & obj){
       
    }
 
};
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.09.2014, 19:14  [ТС] 3
Ну он же скопирует 1 переменную или весь класс?

Добавлено через 2 минуты
Просто мне надо выделять память которая будет = моему классу и копировать туда мой класс, а потом показывать содержимое класса. Я не знаю как это сделать?

Добавлено через 1 минуту
А можно ж написать class B; B=Triangle; ?

Добавлено через 9 минут
alsav22, То что Вы написали мне понятно, но как сделать конкретно для моей задачи.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 19:41 4
Лучший ответ Сообщение было отмечено Mansu как решение

Решение

Как-то так:
C++
1
2
3
4
5
6
class Triangle
{
    friend class Copy;
private:
    char name[31]; // не char*
...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Конструктор копирования.        
    Copy(const Copy & obj)
    {
        tr = new Triangle;
 
        strcpy(tr->name, obj.tr->name);
        
        tr->coordinates = new Triangle::point[3];
        for (int i = 0; i < 3; ++i)
            tr->coordinates[i] = obj.tr->coordinates[i];
        
        for (int i = 0; i < 3; i++)
            tr->stores[i] = obj.tr->stores[i];
        
        tr->area = obj.tr->area;
        tr ->p = obj.tr->p;
    }
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.09.2014, 20:24  [ТС] 5
Спасибо, но почему писать в private? И где класс копи?

Добавлено через 26 секунд
И что в нём. Обьясните пожалуйста

Добавлено через 1 минуту
А, извините, понял. Спасибо.

Добавлено через 3 минуты
Это ж оно 1 раз скопирует?

Добавлено через 9 минут
Просто, мне надо много раз запоминать значения метода show(). А потом вывести их все. Как я смогу их выводить, вернее как мне обращаться. Вот так можно?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Copy(const Copy & obj)
    {
        int j;
        j++;
        tr[j] = new Triangle;
 
        strcpy(tr->name, obj.tr->name);
 
        tr->coordinates = new Triangle::point[3];
        for (int i = 0; i < 3; ++i)
            tr->coordinates[i] = obj.tr->coordinates[i];
 
        for (int i = 0; i < 3; i++)
            tr->stores[i] = obj.tr->stores[i];
 
        tr->area = obj.tr->area;
        tr->p = obj.tr->p;
    }
А вызывать:
for (i=1;j<=j;i++){
printf("",obj.tr[i])
}
Понимаю, что тут ошибки, но хочу хоть как-то попытаться написать и обьяснить Вам.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 20:50 6
Цитата Сообщение от Mansu Посмотреть сообщение
Просто, мне надо много раз запоминать значения метода show().
Конструктор копированя не для этого предназначен.

Добавлено через 4 минуты
Цитата Сообщение от Mansu Посмотреть сообщение
Просто, мне надо много раз запоминать значения метода show().
Что значит: "значения метода show()"? show() что делает?

Добавлено через 1 минуту
Идея в чём?

Добавлено через 4 минуты
Вводите данные, этими данными инициализируется объект Triangle? И так несколько раз (несколько объектов)? Потом вывести, через show(), все данные этих объектов?
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.09.2014, 20:56  [ТС] 7
Да. Я думал для этого нужен конструктор копирования. Вы правы задача такова: мне надо ввести название треугольника, его координаты, а программа сам считает длину сторон и площадь. Я её сделал. Но она помнит только введенные данные. А если я 1 раз показа ответ, а потом сново решил показать, то там уже пусто. И мне надо чтоб я раз ввёл данные, потом еще раз и может быть еще раз. А потом оно вывело всё, что я ввёл + длину и площадь.

Добавлено через 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
#define _CRT_SECURE_NO_WARNINGS
#include <cmath>
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
#include "prog2.h"
 
using namespace std;
 
int main() {
    int otvet = 0, otvet1 = 0, otve=0 ;
    while (otve == 1 && otve ==2 && otve==3);
    {
        printf("Menu:\n");
        printf("1. Press '1' to input data\n");
        printf("2. Press '2' to  output data\n");
        printf("3. Press '3' if you want exit\n");
        scanf("%d", &otve);
    } 
    if (otve == 2){ printf("First you need to enter data\n"); otvet = 1; }
    else otvet = otve;
    Triangle tryk;
    // Ввод условий с клавиатуры
    if (otvet == 1){
        tryk.set();
    }
        printf("Press 1 to continue\n");
        scanf("%d", &otvet1);
        if (otvet1 == 1){
            do{
                printf("Menu:\n");
                printf("1. Press '1' to input data\n");
                printf("2. Press '2' to  output data\n");
                printf("3. Press '3' if you want exit\n");
                scanf("%d", &otvet);
            } while (otvet == 1 && otvet == 2 && otvet == 3);
        }
        if (otvet1 != 1) { exit(1); }
    if (otvet == 2){
    //Вывод условий
    tryk.show();
 
}
printf("Press 1 to continue\n");
scanf("%d", &otvet1);
if (otvet1 == 1){
    do
    {
        printf("Menu:\n");
        printf("1. Press '1' to input data\n");
        printf("2. Press '2' to  output data\n");
        printf("3. Press '3' if you want exit\n");
        scanf("%d", &otvet);
    } while (otvet == 1 && otvet == 2 && otvet == 3);
}
if (otvet1 != 1){ exit(1); }
        //Выход
        if (otvet == 3){
            exit(1);
        }
        _getch();
}
Добавлено через 11 секунд
Может так будет понятно.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 21:16 8
Цитата Сообщение от Mansu Посмотреть сообщение
Но она помнит только введенные данные. А если я 1 раз показа ответ, а потом сново решил показать, то там уже пусто.
Вот это не понял. Пока объект существует, то и данные доступны.
Цитата Сообщение от Mansu Посмотреть сообщение
И мне надо чтоб я раз ввёл данные, потом еще раз и может быть еще раз.
Вот это поясните. Данные для одного треугольника или для нескольких? Если для одного, то зачем несколько раз вводятся разные данные?
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.09.2014, 21:30  [ТС] 9
Да, для разных.

Добавлено через 19 секунд
Чтоб вышло как в базах данных.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 21:30 10
Тогда так: создаёте массив Triangle. В цикле, для каждого элемента массива, вызываете метод set(). Когда массив заполнится, для каждого элемента массива, в цикле, вызываете метод show().
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.09.2014, 21:32  [ТС] 11
Поссоветуйте что нибудь.

Добавлено через 2 минуты
Просто, тут ерунда с тем, что я могу ввести значения для 1 или же для 100 треугольников допустим. Я представлял себе это так. Я ввёл данные, они там обратотались и записались в память, а в память обьекта я сново записал и т.д. А потом я обратился к той памяти и вывел всё, что там есть.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 21:32 12
Массив можно заменить на вектор указателей на Triangle. Создавать обекты в динамической памяти, указатели помещать в вектор. Такой вариант не требует задавать размер массива.
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.09.2014, 21:39  [ТС] 13
Какой массив?

Добавлено через 1 минуту
А почему нельзя создавать каждый раз создавать новый класс и записывать туда с помощью конструктора?

Добавлено через 16 секунд
Просто потому, что это по-дурному?

Добавлено через 1 минуту
Блин, Вы так написали. Я вот теперь не могу понять, пока как это делать)
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 21:50 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
#include <vector>
using namespace std;
 
int main() 
{
    vector <Triangle*> v;
 
    while (true)
    {
        Triangle* ptr = new Triangle();
        ptr ->set();
        v.push_back(ptr);
        cout << "Continue? (y/n)";
        char ch;
        cin >> ch;
        if (ch != 'y' && ch != 'Y')
            break;
    }
 
    int n = v.size();
    for (int i = 0; i < n; ++i)
        v[i] ->show();
 
    for (int i = 0; i < n; ++i) // в классе сделать деструктор
        delete v[i];
   
   _getch();
   return 0;
}
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
27.09.2014, 21:55  [ТС] 15
Спасибо, я попробую и отпишу.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
27.09.2014, 22:00 16
Цитата Сообщение от Mansu Посмотреть сообщение
А почему нельзя создавать каждый раз создавать новый класс и записывать туда с помощью конструктора?
Только не класс, а объект класса. Так и делается.
1
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
28.09.2014, 09:26  [ТС] 17
А вектор это спец. библиотека? И мне лучше это писать в классе, тоесть тас где *.h или в самом файле*.cpp? Где лучше?

Добавлено через 11 часов 20 минут
Можете помочь с этим деструктором?

Добавлено через 3 минуты
[CPP]
~Triangle (void)
{
}
/CPP]
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2014, 09:35 18
Цитата Сообщение от Mansu Посмотреть сообщение
И мне лучше это писать в классе, тоесть тас где *.h или в самом файле*.cpp? Где лучше?
В main(). Или вектор создавать в main(), всё остальное делать в отдельной функции, куда передавать вектор по ссылке.
Цитата Сообщение от Mansu Посмотреть сообщение
Можете помочь с этим деструктором?
C++
1
2
3
4
    ~Triangle()
    {
        delete [] coordinates;
    }
0
0 / 0 / 2
Регистрация: 02.01.2014
Сообщений: 240
28.09.2014, 09:52  [ТС] 19
Оно всеравно выводит только первое, что я ввёл.(((

Добавлено через 4 минуты
Блин, теперь ошибка(((
C++
1
2
3
4
5
6
7
8
void set()
    {....}
void show(){....}
~Triangle()
    {
      delete [] name;   
     delete [] coordinates;
    }
Это h.
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
....
#include <vector>
....
int main() {
    vector <Triangle*> v;
....
if (otvet == 1){
        //tryk.set();
        while (true)
        {
            Triangle* ptr = new Triangle();
            ptr->set();
            v.push_back(ptr);
            cout << "Continue? (y/n)";
            char ch;
            cin >> ch;
            if (ch != 'y' && ch != 'Y')
                break;
             n = v.size();
        }
....
if (otvet == 2){
    //Вывод условий
    //tryk.show();
    for (int i = 0; i < n; ++i)
        v[i]->show();
 
    for (int i = 0; i < n; ++i) // в классе сделать деструктор
        delete v[i];
}
Так же?

Добавлено через 4 минуты
И даже если я ввожу 1 раз, а потом хочу глянуть то там пусто(((

Добавлено через 2 минуты
Run-Time Check Failure #2 - Stack around the variable 'ch' was corrupted.
0
5474 / 4869 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
28.09.2014, 10:30 20
Цитата Сообщение от Mansu Посмотреть сообщение
Оно всеравно выводит только первое, что я ввёл.(((
Цитата Сообщение от Mansu Посмотреть сообщение
Так же?
Без понятия, кода не вижу. Код в студию!

Добавлено через 3 минуты
Цитата Сообщение от Mansu Посмотреть сообщение
n = v.size();
Это зачем? Вектор знает свой размер.

Добавлено через 1 минуту
Цитата Сообщение от Mansu Посмотреть сообщение
И даже если я ввожу 1 раз, а потом хочу глянуть то там пусто(((
Потом - это где в коде?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.09.2014, 10:30

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Конструктор копирования для класса стек
Почему не хочет работать конструктор копирования? struct Item { int value; Item *next;...

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать...

Cделать конструктор по умолчанию и копирования для класса
Вот у меня класс строка: class strg { char *str; int len; public: strg(); strg(const...

Конструктор копирования для динамического объекта класса приемника
class first_class { public: first_class(int q) { m_q=q; cout&lt;&lt;&quot;First class say...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.