Форум программистов, компьютерный форум, киберфорум
Наши страницы

shared_ptr и реализация семантики переноса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Сколько таких действий надо произвести, чтобы получился нуль? (подпрограммы) http://www.cyberforum.ru/cpp-beginners/thread745529.html
Из заданного числа вычли сумму его цифр. Из результата вновь вычли сумму его цифр и т.д. Сколько таких действий надо произвести, чтобы получился нуль? Сумму цифр нужно подсчитать с помощью...
C++ Описать класс с именем ORDER Всем привет, ребята помогите решить задачку. Пропустил лекции теперь не знаю как ее делать. Описать класс с именем ORDER, содержащий поля: - расчетный счет плательщика; - расчетный счет... http://www.cyberforum.ru/cpp-beginners/thread745510.html
C++ Какие переменные используются в программе? (шифровка и расшифровка текста методом решетки)
Какие переменные используются в программе?Это программа шифровки и расшифровки текста методом решетки #include "stdafx.h" #include <iostream> #include "conio.h" using namespace std; int N; ...
Написать функцию замены всех цифр в строке пробелами C++
Помогите пожалуйста написать программу, очень срочно надо Написать функцию замены всех цифр в строке пробелами. Ввести и обработать две смешанные строки(вводятся английские буквы и цифры)....
C++ Базовый класс Complex и производный класс Vector http://www.cyberforum.ru/cpp-beginners/thread745463.html
Создайте базовый класс Complex (комплексное число) для реализации комплексных чисел в алгебраической форме и основных операций с ними: сложения, вычитания, умножения и деления. Создайте производный...
C++ Алгоритм по типу экселевского vlookup. Посоветуйте, как скомпоновать 2 файлика Hi all. Думаю, как лучше сделать следующее (понятно, что можно в Excel'е через vlookup, а как программно?) в общем, есть колонка данных в одном файле: 101 : name1 102 : name2 103 : name3... подробнее

Показать сообщение отдельно
DiffEreD
1431 / 768 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2

shared_ptr и реализация семантики переноса - C++

25.12.2012, 16:21. Просмотров 1912. Ответов 21
Метки (Все метки)

Написал небольшой класс Array основанный на std::shared_ptr. Но как то не совсем уверен в правильности реализации конструктора и оператора переноса. Плюс, возникли какие то неполадки с перегруженным оператором + - он почему то модифицирует объекты которых не должен модифицировать. Что в моем коде не правильно?
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
#include <iostream>
#include <algorithm>
#include <iterator>
#include <memory>
#include <functional>
 
template<typename T>
class Array
{
    std::shared_ptr<T> m_array;
    size_t m_size;
public:
    typedef T*          iterator;
    typedef const T*    const_iterator;
    iterator        begin()         {return m_array.get();}
    iterator        end()           {return m_array.get()+m_size;}
    const_iterator  begin() const   {return m_array.get();}
    const_iterator  end()   const   {return m_array.get()+m_size;}
 
    const T operator[](size_t index) const {return *(m_array.get()+index);}
    T operator[](size_t index) {return *(m_array.get()+index);}
 
    explicit Array(size_t size = 0, const T& value = T()) : m_size(size),
        m_array(new T[size], std::default_delete<T[]>())
    {
        std::fill(m_array.get(), m_array.get()+m_size, value);
    }
 
    Array(const Array& obj) : m_size(obj.m_size), m_array(obj.m_array) {std::cout<<"Array(const Array& obj)\n";}
 
    Array(Array&& obj) : m_size(std::move(obj.m_size)), m_array(std::move(obj.m_array))
    {
        std::cout<<"Array(Array&& obj)\n";
        obj.m_size = 0;
        obj.m_array.reset();
    }
 
    Array& operator=(const Array& obj)
    {
        std::cout<<"Array& operator=(const Array& obj)\n";
        if (this == &obj)
            return *this;
        m_size = obj.m_size;
        m_array = obj.m_array;
        return *this;
    }
 
    Array& operator=(Array&& obj)
    {
        std::cout<<"Array& operator=(Array&& obj)\n";
        m_size = std::move(obj.m_size);
        m_array = std::move(obj.m_array);
        obj.m_size = 0;
        obj.m_array.reset();
        return *this;
    }
 
    Array& operator+=(const Array& rhs)
    {
        std::transform(begin(), end(), rhs.begin(), begin(), std::plus<T>());
        return *this;
    }
 
    Array operator+(const Array& rhs)
    {
        Array ar;
        ar = *this;
        ar+=rhs;
        return ar;
    }
};
 
int main()
{
    {
        Array<int> a1(10, 6);
        Array<int> a2(a1);       //копирующий конструктор
 
 
        /*std::copy(a1.begin(), a1.end(), std::ostream_iterator<int>(std::cout," "));
        std::cout<<"\n\n";
        std::copy(a2.begin(), a2.end(), std::ostream_iterator<int>(std::cout," "));
        std::cout<<"\n\n";
        std::copy(a1.begin(), a1.end(), std::ostream_iterator<int>(std::cout," "));*/
 
        Array<int> b1(a2);      //копирующий конструктор
        Array<int> b2;
        b2 = a1+a2;            //почему то модифицирует объекты a1, a2 и b1
 
        std::cout<<"\n\n";
        std::copy(b1.begin(), b1.end(), std::ostream_iterator<int>(std::cout," "));
 
        std::cout<<"\n\n";
        std::copy(b2.begin(), b2.end(), std::ostream_iterator<int>(std::cout," "));
 
        std::cout<<"\n\n";
        std::copy(a1.begin(), a1.end(), std::ostream_iterator<int>(std::cout," "));
        std::cout<<"\n\n";
        std::copy(a2.begin(), a2.end(), std::ostream_iterator<int>(std::cout," "));
 
    }
    std::cout<<"\n\n";
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru