Форум программистов, компьютерный форум 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
6450 / 3824 / 885
Регистрация: 30.01.2014
Сообщений: 6,618
02.08.2014, 23:07     Перегрузка оператора +
Цитата Сообщение от GetHelp Посмотреть сообщение
что толку? чуть меньше писать при вызове? про остальное тоже самое...
Толк в локализации функциональности в одном месте. Вот приведу пример из самописного класса вектор для POD.
Функция выделения памяти вынесена в отдельный внутренний метод:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    void do_realloc(size_t new_size)
    {
        if(new_size > max)
        {
            throw std::length_error("pod_vector::reserve");
        }
        T* t = (T*)::realloc(m.p, sizeof(T) * new_size);
        if(!t)
        {
            throw std::bad_alloc();
        }
        m.p = t;
        m.a = new_size;
    }
Вот методы, которые ее используют:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    void resize(size_t new_size)
    {
        if(new_size > m.a)
        {
            do_realloc(new_size);
        }
        m.n = new_size;
    }
    void reserve(size_t new_size)
    {
        if(new_size > m.a)
        {
            do_realloc(new_size);
        }
    }
А функции resize и reserve основа для всей остальной функциональности вставки и удаленния. Вот примеры:
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
    template<class Iter>
    void append(Iter f, Iter l)
    {
        size_t n = std::distance(f, l);
        resize(m.n + n);
        std::uninitialized_copy(f, l, m.p + m.n - n);
    }
    template<class Iter>
    void insert(iterator pos, Iter f, Iter l)
    {
        size_t i = pos - m.p;
        size_t n = std::distance(f, l);
        resize(m.n + n);
        pos = m.p + i;
        std::copy_backward(pos, m.p + m.n - n, m.p + m.n);
        std::uninitialized_copy(f, l, pos);
    }
    void push_back(T const & t)
    {
        if(m.a == m.n)
            reserve(m.n ? 2 * m.n : 2);
        m.p[m.n] = t;
        ++m.n;
    }
И теперь представь, если бы мы не выносили это в отдельные методы, а сразу писали все в реализации push_back, append и insert. Они получились бы большие и таким кодом сложно было бы управлять и отлаживать. В противоположность этому, если мы имеем набор отлаженных (пусть и самописных) компонентов, мы сможем жонглировать ими как угодно, и если вдруг какие-либо действия привели к ошибке, у нас всегда будет базовый уровень функциональности, в котором мы уверены. Это сузит круг поиска ошибки и позволит быстрее локализовать проблему. Это и есть принцип "разделяй и властвуй", который я уже упоминал.
 
Текущее время: 07:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru