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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Сколько таких действий надо произвести, чтобы получился нуль? (подпрограммы) http://www.cyberforum.ru/cpp-beginners/thread745529.html
Из заданного числа вычли сумму его цифр. Из результата вновь вычли сумму его цифр и т.д. Сколько таких действий надо произвести, чтобы получился нуль? Сумму цифр нужно подсчитать с помощью подпрограммы.
C++ Описать класс с именем ORDER Всем привет, ребята помогите решить задачку. Пропустил лекции теперь не знаю как ее делать. Описать класс с именем ORDER, содержащий поля: - расчетный счет плательщика; - расчетный счет получателя; - перечисляемая сумма в руб. Написать программу, выполняющую следующие действия: - ввод с клавиатуры данных класса типа ZNAK; - вывод на экран информации о сумме, снятой с расчетного счета... http://www.cyberforum.ru/cpp-beginners/thread745510.html
C++ Какие переменные используются в программе? (шифровка и расшифровка текста методом решетки)
Какие переменные используются в программе?Это программа шифровки и расшифровки текста методом решетки #include "stdafx.h" #include <iostream> #include "conio.h" using namespace std; int N; void RotationMatrix(int **MatrixKey);//поворот решетки
Написать функцию замены всех цифр в строке пробелами 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 104 : name4 105 : name5 подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
25.12.2012, 17:37     shared_ptr и реализация семантики переноса
А я бы как-то так сделал. CoW собственно. Не очень хорошо по отношению к безопасности исключений да и copy-swap бы сделать, но лень.

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
#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(obj.m_size), m_array(std::move(obj.m_array))
    {
        std::cout<<"Array(Array&& obj)\n";
        obj.m_size = 0;
    }
 
    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 = obj.m_size;
        m_array = std::move(obj.m_array);
        obj.m_size = 0;
        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 = deep_copy();
        ar+=rhs;
        return ar;
    }
private:
    Array deep_copy()
    {
       Array ar;
       ar.m_array = std::shared_ptr<T>(new T[m_size], std::default_delete<T[]>());
       const T* array = m_array.get();
       std::copy(array, array + m_size, ar.m_array.get());
       ar.m_size = m_size;
       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";
    return 0;
}
Добавлено через 16 минут
copy/move_and_swap можно сделать как-нибудь так к примеру. Ну это так, изврата ради.

C++
1
2
3
4
5
6
7
8
    template<typename Internal>
    void internal_swap(Internal&& rhs)
    {
       std::swap(m_size, rhs.m_size);
       std::shared_ptr<T> array = m_array;
       m_array = std::forward<std::shared_ptr<T>>(rhs.m_array);
       rhs.m_array = array;
    }
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    Array& operator=(const Array& obj)
    {
        std::cout<<"Array& operator=(const Array& obj)\n";
        if (this == &obj)
            return *this;
        Array ar(obj);
        internal_swap(ar);
        return *this;
    }
 
    Array& operator=(Array&& obj)
    {
        std::cout<<"Array& operator=(Array&& obj)\n";
        internal_swap(std::forward<Array>(obj));
        obj.m_size = 0;
        return *this;
    }
 
Текущее время: 04:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru