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

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

Восстановить пароль Регистрация
 
\\max
 Аватар для \\max
4 / 4 / 1
Регистрация: 19.05.2012
Сообщений: 19
20.12.2012, 23:14     Конструктор копирования #1
Ответьте пожалуйста какой необходим конструктор копирования для объекта класса который передается в функцию?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 23:23     Конструктор копирования #2
чот не понял вопрос, вам надо передать объект в качестве параметра в функцию чтоли?
\\max
 Аватар для \\max
4 / 4 / 1
Регистрация: 19.05.2012
Сообщений: 19
20.12.2012, 23:30  [ТС]     Конструктор копирования #3
Мне нужно передать копию объекта в функцию. У меня просто получается в итоге в функции из-за конструктора копирования по-умолчанию обьект очищается деструктором, а мне необходимо работать с ним дальше, к тому же в main он тоже очищается и получается двойное очищение памяти , что приводит к ошибке.
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 23:35     Конструктор копирования #4
передавайте указателем, указатель самостоятельно не чистится
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
20.12.2012, 23:36     Конструктор копирования #5
Цитата Сообщение от \\max Посмотреть сообщение
получается двойное очищение памяти ,
видать с памятью в классе работаешь
Nixy
ComfyMobile
 Аватар для Nixy
399 / 280 / 8
Регистрация: 24.07.2012
Сообщений: 916
20.12.2012, 23:37     Конструктор копирования #6
покажи нам код свой, мб ошибка в другом
\\max
 Аватар для \\max
4 / 4 / 1
Регистрация: 19.05.2012
Сообщений: 19
20.12.2012, 23:43  [ТС]     Конструктор копирования #7
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
#include <iostream>
#include <conio.h>
 
using namespace std;
 
 
class a
{
    int size;
    int *A;
public:
    a(int n)
    {
        size = n;
        A = new int [size];
        cout << "Enter elements" << endl;
        for (int i = 0; i < size; i++)
        {
            cin >> A[i];
        }
    }
    ~a(){ delete[] A;}
    void output();
    friend long int *operator+ ( a, a );
    friend a operator+ ( int , a );
};
 
 
 
 
void a::output()
{
    for(int i = 0; i < size; i++)
    cout << endl << A[i] << endl;
}
 
void output(long int * A,int n)
{
    cout << endl;
    for(int i = 0 ; i < n; i++) cout << A[i] << endl;
}
long int * operator + (a A,a B)
{
    long int *C = new long int [A.size];
    for(int i = 0; i < A.size ; i++ )
    {
        C[i] = A.A[i] + B.A[i];
    }
    output(C,A.size);
    return C;
 
}
 
a operator+ (int k, a A)
{
    for(int i = 0; i < A.size; i++)
    {
        A.A[i] = A.A[i] + k;
    }
    return A;
}
 
int main()
{
    int m = 0;
    cout << "Enter size of array "<< endl;
    cin >> m;
    
    a A(m);
    cout << "Array A:" << endl;
    
    A.output();
    
    a B(m);
    cout << "Array B:" << endl;
    
    B.output();
    
    operator+ ( A, B );
 
    A = operator+ ( 5, A );
 
    A.output();
 
    _getch();
    return 0;
}
Вполне возможно, я с кодом уже много нашаманил и мог завтыкать не раз.
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
20.12.2012, 23:46     Конструктор копирования #8
возьмем класс
C++
1
2
3
4
5
6
7
class A
{
 int* lpbuf;
 public:
 A(){ lpbuf=new int[10];};
 ~A() { delete[] lpbuf;};
}
если этот класс скопировать то конструктор копирования по умолчанию скопирует указатель
т.е в классе копии он будет указывать туда же куда и оригинал, и при разрушении копии с оригиналом не возможно работать
здесь нужно переопределить конструктор копирования
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
{
 int* lpbuf;
 public:
 A(){ lpbuf=new int[10];};
//вот он конструктор копирования
 A( A*a){ 
  lpbuf=new int[10]; // выделяем новую память
  memcpy(lpbuf,a->lpbuf,sizeof(int)*10);// копируем из оригинала содержимое памяти
// необходимо скопировать и другие члены(если они есть) поскольку
// конструктора копирования по умолчанию больше не существует
 
};
 
 
 ~A() { delete[] lpbuf;};
}
\\max
 Аватар для \\max
4 / 4 / 1
Регистрация: 19.05.2012
Сообщений: 19
20.12.2012, 23:49  [ТС]     Конструктор копирования #9
Спасибо ValeryS это именно то о чем я спрашивал.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2012, 23:53     Конструктор копирования
Еще ссылки по теме:

Конструктор инициализации, конструктор копирования, деструктор C++
Конструктор копирования C++
C++ Конструктор копирования

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6378 / 4844 / 442
Регистрация: 14.02.2011
Сообщений: 16,065
20.12.2012, 23:53     Конструктор копирования #10
пардон наврал
вот как должен выглядеть конструктор копирования
C++
1
2
3
4
5
6
7
A( A &a){ 
  lpbuf=new int[10]; // выделяем новую память
  memcpy(lpbuf,a.lpbuf,sizeof(int)*10);// копируем из оригинала содержимое памяти
// необходимо скопировать и другие члены(если они есть) поскольку
// конструктора копирования по умолчанию больше не существует
 
};
вот здесь подробнее описано
http://ru.wikipedia.org/wiki/Конструктор_копирования
Yandex
Объявления
20.12.2012, 23:53     Конструктор копирования
Ответ Создать тему
Опции темы

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