0 / 0 / 0
Регистрация: 26.12.2014
Сообщений: 38
1

OOP Конструктор копирования

29.05.2015, 00:47. Показов 1683. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть программа
Вопрос:
При закомментировании конструктора копирования в ход идет дефолтный конструктор копирования
но при этом он работает неправильно, почему?
когда мы вызываем в мейне конструктор, потом присваиваем нулевому значению массива другое значение, оно все равно вылезает, а по сути не должно, ибо мы уже скопировали все значения а в с

mainvectir.cpp
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
#include <iostream>
#include "vector.h"
 
int main(void)
{
    vector a(6), b(4);
    int r=0, d=0;
    r=a.size();
    d=b.size();
    printf("\nrazmer vectora a = %d", r);
    printf("\nrazmer vectora b = %d", d);
    printf("\n");
    a==b;
    a[3]=4;
    printf("\nvector a =");
    a.print();
    printf("\na[3]=");
    a[3].print();
    a=4.2;
    vector c=a;//по умолчанию создал побитовую копию а в с, копирует поля а в поля с
//  printf("\nvectory a prisvoili 4.2, on raven");
    printf("\na");
    a.print();
    printf("\nc");
    c.print();
    a[0]=123456;//почему дефолтный работает неправильно
 
    printf("\nc");
    c.print();
 
    printf("\nvector b = ");
    b.print();
    printf("\nsumma vectorov");
 
    a+b;
    a=b;
    printf("\na=b => vector a raven");
    a.print();
    
    printf("\n");
    system("pause");
}
vector.h

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "myfloat2.h"
 
class vector
{
    myfloat2 *v;
    int sz;
public:
    vector(int =25);
    ~vector();
    vector(myfloat2 h[]);
    //vector(vector &);// конструктор копирования, тот самый!!!!!!!!!!!!
    
    inline int size() {return sz;}
    myfloat2 &operator[](int);//оператор индексации
    myfloat2 &elem(int i) {return v[i];}//получение адреса элемента вектора
    void print();
    void operator=(double);//присваивание всем элементам тип double
    void operator=(vector &);//оператор присваивания векторов
    void operator+(vector &);//оператор с  ложения векторов
    void operator==(vector&);//опер сравнения векторов
};
void error(char *p);
vector.cpp

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 <stdio.h>
#include "vector.h"
 
vector::vector(int s)
{
    if (s<=0) error("error");
    sz=s;
    v=new myfloat2[s];
    if (v==0) error("there is not enough memory");
 
}
vector::~vector()
{
    delete []v; //удаление вектора полностью
}
myfloat2 &vector::operator[](int i)
{
    if (i<0 || i>=sz) error("\nvi zadali nevernoe chislo.");
    return v[i];
}
/*vector::vector(vector &b)//конструктор копирования, тот самый!!!!!!!
{
    int k=b.size();
    if(k!=0)
    { 
        v=new myfloat2[k];
        for (int i=0; i<k; i++) 
    {
        v[i]=b[i];
    }
    }
}*/
void error(char *p)
{
    printf(p);
}
void vector::print()
{
    for(int i=0; i<sz; i++)
    {
        v[i].print();
    }
}
void vector::operator=(double p)//оператор присваивания вещественного числа
{
    for(int i=0; i<sz; i++)
    {
        v[i]=p;
    }
}
void vector::operator==(vector &q)//оператор сравнения векторов
{
    int u=q.size();
    int flag=0;
    if(sz==u) 
    for (int i=0; i<sz; i++)
    {
        if (v[i]==q[i]) flag++;
    }
    if (flag==sz) printf("vectora ravni"); else printf("vectora ne ravni");
}
 
void vector::operator+(vector &q)
{
    int u=q.size();
    if (sz!=u) error ("\nvectora ne ranvi. slozhenie impossible");
    else
    {
        vector l(sz);
        for (int i=0; i<sz; i++)
        {
            l[i]=v[i]+q[i];
        }
        l.print();  
    }
}
void vector::operator=(vector &q)//оператор присваивания векторов
{
    int u=q.size();
    if (sz==u) 
    { 
        for(int i=0; i<sz; i++)
    {
        v[i]=q[i];
    }
    } else 
    {
        sz=u;//!!!!!!!!!!!!!!!!!!!!!!!!!!!В ОДНУ ФУНКЦИЮ!!!!!!!!!!!!!!!
        delete v;
        v=new myfloat2[sz];
        for(int i=0; i<sz; i++)
        {
            v[i]=q[i];
        }
    }
}
Миниатюры
OOP Конструктор копирования  
Вложения
Тип файла: 7z Лаба 3 — копия.7z (1.15 Мб, 2 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.05.2015, 00:47
Ответы с готовыми решениями:

Не могу сделать чтобы класс содержал основной конструктор и конструктор копирования
Разработать класс ThreeAngle для работы с плоскими треугольниками. В качестве членов-данных...

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

Не могу правильно сделать конструктор и конструктор копирования и принадлежность точки с заданными координатами треугольнику
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include...

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор...

7
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
29.05.2015, 01:06 2
Лучший ответ Сообщение было отмечено knyazok как решение

Решение

В код Ваш сильно не вникал, но попробую объяснить. Обратите внимание, в Вашем конструкторе используется операция new. Т.е. некоторые поля объекта являются указателями, а в конструкторе Вы выделяете для них память из кучи, на которую эти указатели указывают. Дефолтный конструктор копирования просто копирует указатели, но не память, на которую они указывают! Выходит, что после такого копирования Вы имеете 2 объекта, которые указывают на одну область памяти. Таким образом, изменили данные одного объекта, второй объект изменится автоматически. Такое копирование еще называют поверхностным копированием. Специально написанный конструктор копирования решает эту проблему. В нем для нового объекта должен выделяться новый кусок памяти, чтобы после копирования объекты указывали на разные области памяти. Такое копирование называют глубоким копированием.
Вообще есть такое правило: если в конструкторе есть операция new -- пиши конструктор копирования.
1
0 / 0 / 0
Регистрация: 26.12.2014
Сообщений: 38
29.05.2015, 20:16  [ТС] 3
Благодарю!
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
29.05.2015, 21:11 4
Цитата Сообщение от goditsa8 Посмотреть сообщение
Вообще есть такое правило: если в конструкторе есть операция new -- пиши конструктор копирования.
Такого правила нет, но есть "Правило трёх".
1
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
30.05.2015, 14:29 5
Цитата Сообщение от Tulosba Посмотреть сообщение
Такого правила нет, но есть "Правило трёх".
Да, так, наверное, правильней. )
Вообще, new обычно добавляет работы. )
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.05.2015, 14:35 6
goditsa8, Чтобы не добавляло, стоит использовать "умные" указатели.
1
15 / 15 / 3
Регистрация: 04.02.2013
Сообщений: 124
30.05.2015, 14:41 7
Цитата Сообщение от Tulosba Посмотреть сообщение
goditsa8, Чтобы не добавляло, стоит использовать "умные" указатели.
+, если скорость выполнения не критична.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.05.2015, 14:57 8
goditsa8, в некоторых случаях оверхеда от использования умных указателей ноль. Одни плюсы!
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2015, 14:57
Помогаю со студенческими работами здесь

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

Конструктор копирования
Ответьте пожалуйста какой необходим конструктор копирования для объекта класса который передается в...

Конструктор копирования
Помогите сделать для этого конструктор копирования. class Animal { private: int n; int age;...

Конструктор копирования
Доброго времени суток! Написала класс Треугольная матрица. Не могу исправит такую вот ошибку: ОС...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru