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

Deep copy and Shadow copy - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Ошибка при выполнении http://www.cyberforum.ru/cpp-beginners/thread629877.html
Привет всем. Скажите пожалуйста, что мне делать? При выполнении программы выдает ошибку "Инструкция по адресу "0x004013bd" обратилась к памяти по адресу "0х00000002". Память не может быть "written". Использую для создания проги Dev-C++.
C++ Ввод структуры в текстовый файл столбиком и вывод данных из файла в структуру Имеется база данных в виде структуры, которая будет постепенно дописываться приблизительно до 1000 элементов. В каждом элементе структуры 10 составляющих разных размеров и размерности. struct x { char y1; char y2; char y3; char y4; char y5; char y6; char y7; http://www.cyberforum.ru/cpp-beginners/thread629872.html
Overloading [] operators C++
Преект компилируется нормально. По заданию нужно чтобы было реализованно 2 версии оператора одна для чтения другая для записи типа дано что нужно их декларироватьмплемн вот таким образом Point& operator (int index); const Point& operator (int index) const; имплементацию надо сделать самому ПРОБЛЕМА: Я в имплементации добавил чтоб он мне выводим какой оператор вызывается для чтения...
Найти количество отрицательных элементов строк, которые содержат хотя бы один нулевой элемент C++
Задание: Найти количество отрицательных элементов строк, которые содержат хотя бы один нулевой элемент. Ошибка в функции work: он ищет все отрицательные элементы, а нужно чтобы искал там где есть хоть бы один 0. Как сделать правильно это условие.. #include "stdafx.h" #include "math.h" #include "stdio.h" #include <clocale> const int MAX_N=100; //Максимальные размеры массива const...
C++ Подскажите название книги http://www.cyberforum.ru/cpp-beginners/thread629855.html
Не подскажите название книги по c++: у нёё было два автора, к ней прилагался cd, в начале не объяснялась структура длинной команды (просто говорилось что она делает), и описывалась работа не в visual studio, а в чём-то другом.
C++ Начало программирования Подскажите книжку для начала программирования на c++, а то я не уверен что Стивен Прата подходит для начала. подробнее

Показать сообщение отдельно
Leeto
 Аватар для Leeto
7 / 7 / 0
Регистрация: 23.12.2011
Сообщений: 372
Записей в блоге: 1
28.07.2012, 11:30     Deep copy and Shadow copy
Этот проект компилируется нормально. И функциональность всех элементов на первый взгляд нормальная.
ПРОБЛЕМА: Надо сделать нормально = оператор и копи конструктор.
Вообщем где или кто и как то я услышал (не важно ) что есть такое понятие как shadow copy and deep copy. Типа вроде как если имплиминтировать как я сделал, то

C++
1
2
// from Array. cpp
m_size = source.m_size;                             // shallow copy - this is not dynamic alloc
Это получается shallow copy и вроде как если я меняю объект с которого копировали то и скопированный объект тоже изменется в этой дате. Я не знаю на сколько это правда или нет. Сдалал пробник попробовал переназначить размер массива и компелятор меня на пропустил...
Вообщем, моя проблема в том, что я сомневаю правильно ли я сдалал копирование m_size даты. Пожалуйста, помогите мне разобраться.

У меня возникла идея вот такой имплиментации насколько она корректна не знаю, оцените пожалуйста
Было
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
Array& Array::operator = (const Array& source)
        {
            
 
            std::cout << " In the Array Assignment operator\n";
 
            if (this == &source)
                {
                std::cout << "Same Array \n"; 
                return *this;
                }
 
            delete [] m_data;
            std::cout << "Deleted m_data array\n";
 
            m_size = source.m_size;                             // shallow copy - this is not dynamic alloc
 
            if (source.m_data)                                  // if not zeros then there is a ref.
            {
                std::cout <<"im here\n"; 
 
                m_data = new Point[source.m_size];              // create a new pointee.
 
                for (int i = 0; i < source.m_size; i++)
                    m_data[i]    =    source.m_data[i];         //copy the points from/to array
            }
            else
                m_data = 0;  //NULL
 
            return *this;
        }
Стало
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
Array& Array::operator = (const Array& source)
        {
            
 
            std::cout << " In the Array Assignment operator\n";
 
            if (this == &source)
                {
                std::cout << "Same Array \n"; 
                return *this;
                }
 
            delete [] m_data;
            std::cout << "Deleted m_data array\n";
 
                                            // shallow copy - this is not dynamic alloc
 
            if (m_size)                             // if not zeros then there is a ref.
            {
                std::cout <<"im here\n"; 
 
                m_data = new Point[m_size];             // create a new pointee.
 
                for (int i = 0; i < m_size; i++)
                    m_data[i]    =    source.m_data[i];         //copy the points from/to array
            }
            else
                m_data = 0;  //NULL
 
            return *this;
        }
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
//array.hpp // A header file for the Array class to your current project.
#ifndef Array_HPP
#define Array_HPP
 
#include "Point.hpp"
#include <iostream>
 
 
class Array
{
private:    
 
    Point* m_data;                  // A data member for a dynamic C array of Point objects (Point* m_data).
    int m_size;                     // A data member for the size of the array.
 
 
public: 
 
    //----------- Declaration of Constructors -----------//
    Array::Array();                         // Default constructor
    Array::Array(const int new_size);       // Constructor with size argument.
    Array::Array(const Array& ar);          // Copy constructor
    Array::~Array();                        // Destructor
 
 
    //----------- Declaration of Accessors member functions -----------//
    int Array::Size() const;                                // Get the data of m_size 
    Point& GetElement(int index) const;                     // Return a Element(Point* m_data) by given index of a Array object
    
 
    //----------- Declaration of Modificator(s) member functions -----------//
    void   SetElement(const Point& pt, int index);          // Set Element to a Array object
 
 
    //----------- Declaration of Operators Overloading the class's members -----------//
    Array& operator =  (const Array& source);               // Overloading Assignment operator.
    Point& operator [] (int index);                         // Return a reference to needed m_data. Using for writing 
//  const Point& operator [] (int index) const ;            // Return a reference to needed m_data. Using for reading
 
 
    //----------- Declaration of Global (friend) Ostream << Operator  -----------//
    friend std::ostream& operator << (std::ostream& os, const Array& ar);           // Overloading << operator
 
}   /*!!!*/; /*!!!*/
#endif // Array_HPP
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
#ifndef Point_HPP // anti multiply including gates
#define Point_HPP
 
#include <string>
#include <iostream>
#include <sstream>
 
 
class Point
{   
    private:        //  declaration of private data members 
    double x;       // X coordinate
    double y;       // Y coordinate
 
    public:         // public declaration of data members (in given example haven't ) and member functions 
 
 
        //----------- Declaration of Constructors -----------//
    Point();                                        // Default constructor
    Point(double newX , double newY);               // Constructor 
    Point (const Point& ObjectOfClassPoint);        //COPY constructor
    
 
    //----------- Declaration of Global Ostream << Operator  -----------//
    friend std::ostream& operator << (std::ostream& out, Point const& ObjPoint); 
    friend std::ostream& operator << (std::ostream& out, Point const *objPoint);
    
}   /*!!!*/; /*!!!*/
#endif // Point_HPP
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
//Array.cpp
#include "Array.hpp"
                                        
    //----------- Implementation of Constructors -----------//
    Array::Array() :  m_size(10), m_data(new Point[m_size])                                    
            {
                std::cout << "Array Default Constructor was called " ;
            }
 
    Array::Array(const int new_size) :m_size(new_size), m_data(new Point[m_size])       //specified by the size input argument
                                    
            {   
 
                std::cout << "Array Constructor was called "; 
            }
 
    Array::Array(const Array& ObjArray) 
{
    std::cout << "Array copy Constructor "; 
 
    m_size    =    ObjArray.m_size;     // shallow copy - this is not dynamic alloc
 
    if (ObjArray.m_data)                // if not zeros then there is a ref. - Deep copy needed
    {
        std::cout <<"im on Copy Constructor was called ";
 
        m_data = new Point[ObjArray.m_size];
 
        for (int i = 0; i < ObjArray.m_size; i++)
            m_data[i]    =    ObjArray.m_data[i];
    }
    else
        m_data = 0;                     //NULL
}
    Array::~Array()                                 
        {
            
 
            std::cout << "Array Destructor was called" ;
            delete [] m_data;
        }
    //----------- Declaration and  of Modificators member functions -----------//
    void Array::SetElement(const Point& ObjPoint, int index)
        {   
    
            if (index <= m_size) // When the index is out of bounds, ignore the “set”. 
            {
                m_data[index] = ObjPoint;
                std::cout << "Set Element " << ObjPoint  << std::endl;
            }
            else 
                std::cout << "The Element with index [ "<< index << " ] and\ndata ( " << m_data <<  " ) wasn't setted. "
             << " Ignore the set" <<  std::endl;
        }
    //----------- Implementation of Accessor(s) member functions -----------//
    Point& Array::GetElement(int index) const
        {   
 
            std::cout << "GetElement "; 
            if (index > m_size || index < 0)
            {
                return m_data[0];
            }
 
            return m_data[index];
        }
    int Array::Size() const // Get size
    { 
        return m_size;
    }
    //----------- Implementation of Operators Overloading the class's member -----------//
    Array& Array::operator = (const Array& source)
        {
            
 
            std::cout << " In the Array Assignment operator\n";
 
            if (this == &source)
                {
                std::cout << "Same Array \n"; 
                return *this;
                }
 
            delete [] m_data;
            std::cout << "Deleted m_data array\n";
 
            m_size = source.m_size;                             // shallow copy - this is not dynamic alloc
 
            if (source.m_data)                                  // if not zeros then there is a ref.
            {
                std::cout <<"im here\n"; 
 
                m_data = new Point[source.m_size];              // create a new pointee.
 
                for (int i = 0; i < source.m_size; i++)
                    m_data[i]    =    source.m_data[i];         //copy the points from/to array
            }
            else
                m_data = 0;  //NULL
 
            return *this;
        }
    //----------- Implementation of GLOBAL(friend) Ostream << Operator  -----------//
std::ostream& operator << (std::ostream& os, const Array& ObjArray)
{
    os << "\nArray Size = " << ObjArray.m_size << std::endl;
 
        for (int i = 0; i < ObjArray.m_size; i++)
            os << "Array [" << i << "]= "<< ObjArray.m_data[i] << "\n";
 
    return os;
}
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
#include "Point.hpp"
 
 
            //----------- Implementation of Constructors -----------//
 
    Point::Point() : x(0) , y(0)                                                        // Default constructor (implemented using colon syntax )
        { 
        //  std::cout << "hi my default constructor\n\n\t";
        }                           
 
    Point::Point(double newX , double newY) : x(newX)  , y(newY)                        // Constructor 
        { 
            //std::cout << "hi my constructor\n\n\t"; 
        }               
    Point::Point (const Point& ObjectOfClassPoint)                                      // Copy constructor
        {
            //std::cout << "this is COPY constructor\n\n\t ";
            x = ObjectOfClassPoint.x;
            y = ObjectOfClassPoint.y;
        }
    
    //----------- Implementation of GLOBAL Ostream << Operator  -----------//
 
    std::ostream& operator << (std::ostream& out, Point const& ObjPoint)
{
    return out << "[" << ObjPoint.x << "," << ObjPoint.y << "]" ; 
}
        std::ostream& operator << (std::ostream& out, Point const *objPoint)
{ 
    return out << "[" << objPoint->x << "," << objPoint->y << "]" ; 
}
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
//main.cpp
 
#include <iostream>
#include "Point.hpp"
#include "Array.hpp"
 
 
 
int main()
 
    {
 
    
 
 
    int i = 0;                                              
    int size_of_array = 5;                                      
    Point** MyArrayOfPointers;
    MyArrayOfPointers = new Point*[size_of_array];                      //Creating an array of Point pointers with 3 elements on the heap.
    
    int some_data_for_x[5] = {1830 , 1901 , 1914, 1900 , 1895} ; 
    int some_data_for_y[5] = {1903 , 1947 , 1211, 1969 , 1789} ; 
 
   
    for (i = 0 ; i <size_of_array; i++ )                                // Create for each element in the array a point on the heap.
        {
            MyArrayOfPointers[i] = new Point(some_data_for_x[i],                
                                                some_data_for_y[i]);                                                                                        
        }
   
    std::cout << "\n\t Setting elements of MemoryManagerArray \n";
 
    Array* MemoryManagerArray = new Array(size_of_array); 
    MemoryManagerArray->SetElement(*MyArrayOfPointers[0],0);                // Setting elements of MemoryManagerArray
    MemoryManagerArray->SetElement(*MyArrayOfPointers[1],1);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[2],2);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[3],3);
    MemoryManagerArray->SetElement(*MyArrayOfPointers[4],4);                // The set will be ignored, because out of bounds
 
 
 
  
     std::cout << "\n\t ---TEST OF Assignment operator--- \n";
 
    *MemoryManagerArray = *MemoryManagerArray;                                          // assignment operator test
 
    std::cout   << "\n\t Printing elements of MemoryManagerArray \n";
    std::cout   << MemoryManagerArray->GetElement(0) << "\n"                            // Printing elements of MemoryManagerArray
                << MemoryManagerArray->GetElement(1) << "\n"
                << MemoryManagerArray->GetElement(2) << "\n"
                << MemoryManagerArray->GetElement(3) << "\n"
                << MemoryManagerArray->GetElement(4) << "\n"        ;   
 
 
    Array* AssignmentOperatorTESTArray = new Array(size_of_array); 
 
    *AssignmentOperatorTESTArray = *MemoryManagerArray;                                 // assignment operator test
 
    std::cout   << "\n\t Printing elements of AssignmentOperatorTESTArray \n";
    std::cout   << AssignmentOperatorTESTArray->GetElement(0) << "\n"                   // Printing elements of MemoryManagerArray
                << AssignmentOperatorTESTArray->GetElement(1) << "\n"
                << AssignmentOperatorTESTArray->GetElement(2) << "\n"
                << AssignmentOperatorTESTArray->GetElement(3) << "\n"
                << AssignmentOperatorTESTArray->GetElement(4) << "\n";  
   
    std::cout << "\n\t ---TEST OF Copy Constructor operator--- \n";
 
    Array CopyConstructorTESTArray(*MemoryManagerArray  )   ;                 // Copy constructor test
    
 
    std::cout   << "\n\t Printing elements of CopyConstructorTESTArray \n";
    std::cout   << CopyConstructorTESTArray.GetElement(0) << "\n"                       // Printing elements of MemoryManagerArray
                << CopyConstructorTESTArray.GetElement(1) << "\n"
                << CopyConstructorTESTArray.GetElement(2) << "\n"
                << CopyConstructorTESTArray.GetElement(3) << "\n"
                << CopyConstructorTESTArray.GetElement(4) << "\n";  
    
    size_of_array = 17; 
    Array* MemoryManagerArray = new Array(size_of_array); 
 
    
     std::cout  << "\n\t Shadow copy test  \n";
 
    std::cout << CopyConstructorTESTArray.GetElement(16) << "\n";
    
    std::cout << std::endl; 
    return 0;
 
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 06:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru