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

Перегрузка оператора + - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как грамотно подключать заголовочные файлы? http://www.cyberforum.ru/cpp-beginners/thread1237648.html
Как грамотно подключать заголовочные файлы? Можно ли их все собрать в stdafx.h а потом инклюдить там где они мне нужны? А то сейчас получается, в одном .h объявил переменную с типом класса который описан в другом .h и посыпались ошибки.
C++ Алгоритм добавления элемента в сортированный список Нужно придумать алгоритм для добавления элемента в сортированный список(STL list<char>), то есть этот алгоритм должен сравнивать введенный элемент с уже имеющимися элементами в списке и встать в нужное место. Я думал организовать алгоритм с помощью бинарного поиска, но возникает вопрос, как определить итератор на центр списка. http://www.cyberforum.ru/cpp-beginners/thread1237642.html
Получение данных из файла C++
Задача№6. Постройте программу, которая отслеживает пожертвования в Общество Защиты Влиятельных Лиц. Она должна запрашивать у пользователя количество меценатов, а затем приглашать вводить их имена и суммы пожертвований от каждого. Информация должна сохраняться в динамически выделяемом массиве структур. Каждая структура должна иметь два члена: символьный массив (или объект string) для хранения...
C++ Обход графа в ширину - Breadth First Search (BFS)
Всем привет! Я не понимаю алгоритм обхода в глубину BFS:( Кто может помощь?
C++ Передача препроцессорных определений в командной строке http://www.cyberforum.ru/cpp-beginners/thread1237632.html
Здравствуйте! Подскажите пожалуйста, как передать препроцессорное определение через командную строку. То есть пишется код, который проверяет определение DEBUG (#ifndef DEBUG) и если оно определено, то вставляются, допустим, инварианты. Хочу, научиться передавать определение DEBUG не вручную определяя, а через консоль. Есть такие методы? (использую MVS 2012)
C++ Чем отличаются знаковые и беззнаковые типы? Здравствуйте. Все не могу понять, чем отличаются знаковые и беззнаковые типы? И для каких типов они есть? short int это тоже самое, что и unsigned int? подробнее

Показать сообщение отдельно
DrOffset
6458 / 3832 / 885
Регистрация: 30.01.2014
Сообщений: 6,627
03.08.2014, 02:34     Перегрузка оператора +
Цитата Сообщение от GetHelp Посмотреть сообщение
я ничего не откуда не копипастил, я вообще не смотрел то что вы там кидали
Это кстати зря, что не смотрел.
Да я и не про себя говорил. И даже не про тебя, т.е. я не имел в виду тебя, когда писал про копипаст. Я вообще говорил о тенденции (это очень часто здесь встречается) и о соблазне брать что дают не особо разбираясь. А потом был переход уже на нашу ситуацию и предостережение не понимать буквально то, о чем я тебе пишу, а постараться вникнуть в то, зачем вообще это нужно. Вот о чем был пост.

Кстати твой класс в первом приближении можно описать всего двумя методами: assign и append.
Примерно так, назовем этот класс DumbString (потому что он простой):
Кликните здесь для просмотра всего текста

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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <iostream>
#include <cstring>
#include <cstdlib>
 
class DumbString
{
public:
    typedef char value_type;
 
    DumbString()
        : size_(), data_()
    {}
 
    DumbString(value_type const * str)
        : size_(), data_()
    {
        assign(str, std::strlen(str));
    }
    DumbString(value_type const * str, size_t len)
        : size_(), data_()
    {
        assign(str, len);
    }
    DumbString(DumbString const & other)
        : size_(), data_()
    {
        assign(other.data_, other.size_);
    }
    DumbString & operator=(DumbString const & other)
    {
        if(this != &other)
        {
            assign(other.data_, other.size_);
        }
        return *this;
    }
    DumbString & operator=(value_type const * str)
    {
        assign(str, std::strlen(str));
        return *this;
    }
 
    ~DumbString()
    {
        deallocate(data_);
    }
 
    size_t length() const
    {
        return size_;
    }
    char & operator[](size_t index)
    {
        return data_[index];
    }
    char operator[](size_t index) const
    {
        return data_[index];
    }
 
    DumbString operator+(const char * str)
    {
        DumbString ret(*this);
        ret.append(str, std::strlen(str));
        return ret;
    }
    DumbString operator+(DumbString const & other)
    {
        DumbString ret(*this);
        ret.append(other.data_, other.size_);
        return ret;
    }
 
    value_type const * c_str() const
    {
        return data_ ? data_ : "";
    }
 
    void clear()
    {
        deallocate(data_);
        data_ = 0;
        size_ = 0;
    }
private:
    void assign(value_type const * str, size_t len)
    {
        if(len)
        {
            if(size_ != len)
            {
                data_ = reallocate(data_, len + 1);
                size_ = len;
            }
            std::memcpy(data_, str, len);
            data_[size_] = 0;
        }
        else
        {
            clear();
        }
    }
    void append(value_type const * str, size_t len)
    {
        if(len)
        {
            data_ = reallocate(data_, size_ + len + 1);
            std::memcpy(data_ + size_, str, len);
            size_ = size_ + len;
            data_[size_] = 0;
        }
    }
 
    static value_type * reallocate(value_type * data, size_t n)
    {
        value_type * m = static_cast<value_type*>(std::realloc(data, sizeof(value_type) * n));
        if(!m)
        {
            throw std::bad_alloc();
        }
        return m;
    }
 
    static void deallocate(value_type * data)
    {
        std::free(data);
    }
 
private:
    size_t       size_;
    value_type * data_;
};
 
int main()
{
    DumbString a = "test";
    DumbString b = "string";
    DumbString c = "";
    DumbString d;
 
    DumbString a1 = a + " " + b;
 
    std::cout << a1.c_str() << std::endl;
    a1 = "abc";
    std::cout << a1.c_str() << std::endl;
}

Опять же, это лишь иллюстрация. В ней предполагается, что пустая строка - это когда нет выделенной памяти. Никакой оптимизации аллокаций нет (ее не было и в оригинальном коде). Так что единственное, что я здесь могу гарантировать - это то, что этот класс работает не медленнее, чем первоначальная иллюстрация от ТС. Можно будет позже обсудить методологии оптимизации таких контейнеров, возможно в отдельной теме.

Итак, вернемся к сути. Пример выше демонстрирует насколько важно проводить декомпозицию задачи: практически весь функционал класса реализуется всего двумя методами. Мы выделили самые базовые версии этих методов и взяли их за основу в реализации всех остальных.
Надеюсь, теперь я донес мысль.
 
Текущее время: 08:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru