Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.97/30: Рейтинг темы: голосов - 30, средняя оценка - 4.97
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116

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

02.08.2014, 17:56. Показов 7937. Ответов 83
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
не получается в своем классе перегрузить оператор + пишет "error C2804: бинарный "operator +" имеет слишком много параметров", действительно задал 2 параметра, но как еще то? ведь + и подразумевает собой сложение 2х значений...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.08.2014, 17:56
Ответы с готовыми решениями:

Перегрузка оператора ^
Здравствуйте! Необходимо перегрузить бинарный оператор ^ для транспонирования матрицы. Есть класс матрицы: template <class T> ...

Перегрузка оператора +
Написал для перегрузки оператора + class BoolMatrix { private: int feet; public: BoolMatrix(int f): feet(f) {} ...

перегрузка оператора!
Помогите сложить диагонали , при помоши перегрузки оператора+, чтобы можно было написать в maine: c1+c2+c3.заранее спасибо! ...

83
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
02.08.2014, 23:39
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от GetHelp Посмотреть сообщение
DrOffset, я лучше напишу общие аллокаторы...
Да без проблем. Именно к этому я тебя и подвожу. Остальные моменты (не обязательно в текущей задаче) точно так же поддаются разбиению на подзадачи. Все, что выше - это была лишь иллюстрация, чтобы ты понял.

Кстати realloc работает как malloc (или calloc) если первым аргументом передан NULL. Так что смысла той проверке в С-варианте нет.

Еще вот добавлю:
Очень многие в ответах на форуме пишут, так сказать, иллюстрационный код, чтобы пояснить идею. Это не значит (и не должно значить), что это законченный и готовый к использованию продукт. Так что копипастить с форума к себе в проект идея потенциально чреватая ошибками. Отсюда вот такие посты:
"форумчанин": сделай то и то.
"ТС": сделал - не помогло.
Как правило "сделал" в этом случае означает копипаст в проект и пробный запуск. А в идеале надо бы разобраться с тем, что же предлагается. Откуда растут ноги и почему. Допустим загуглить или спросить еще раз в уточняющем посте.
Так и в нашем с тобой случае, вот я тебе советую нечто. Привожу конкретный пример с аллокацией (кстати посомори как сделано в std::vector - там все именно так, как я тебе предлагаю), но вот это совсем не значит, что нужно править только аллокацию. Я тебе предлагаю в целом изменить подход. Писать функции так, чтобы они решали одну конкретную задачу, если задача слишком сложна, стоит разбить ее на подзадачи и решить сначала их. Оттестировать, продолжить далее. Твои ошибки типичные, в том числе потому, что в голове почти любого человека не может поместиться слишком много информации одновременно. Когда задача разрастается, становится очень сложно решать вопросы, т.к. за мелочами скрывается суть (поговорка "за деревьями леса не видно"). Один из самых эффективных способов борьбы с такой сложностью - это повышение уровня абстракции (разделяй и властвуй). Есть такое крылатое выражение "Любую проблему можно решить повышением уровня абстракции, кроме проблемы слишком большого числа абстракций", это и указание и предостережение. С одной стороны понятно как решать вопросы, с другой стороны понятно что грозит, если слишком этим увлечься.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
03.08.2014, 00:44  [ТС]
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void* c_allocate(void* ptr, size_t size)
{
    void* retval;
    (ptr) ?
        retval = realloc(ptr, size * sizeof(ptr)) :
        retval = calloc(size, sizeof(ptr));
    ptr = retval;
    return retval;
}
 
void c_deallocate(void* ptr)
{
    if (ptr) free(ptr);
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
template <typename T>
T* cpp_allocate(T* ptr, size_t old_size, size_t new_size)
{
    T* retval = new T[new_size];
    if (ptr)
    {
        memcpy(retval, ptr, old_size);
        delete[] ptr;
    }
    ptr = retval;
    return retval;
}
 
template <typename T>
void cpp_deallocate(T* ptr)
{
    if (ptr) delete[] ptr;
}
Добавлено через 44 минуты
DrOffset, я ничего не откуда не копипастил, я вообще не смотрел то что вы там кидали... код полностью мой... но впрочем я ушел от темы, про аллокаторы открыл новую
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
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;
}

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

Итак, вернемся к сути. Пример выше демонстрирует насколько важно проводить декомпозицию задачи: практически весь функционал класса реализуется всего двумя методами. Мы выделили самые базовые версии этих методов и взяли их за основу в реализации всех остальных.
Надеюсь, теперь я донес мысль.
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
03.08.2014, 10:46
правильная по Дзен перегрузка оператор+ - в виде свободной функции
C++
1
2
3
4
5
T operator+(const T& a, const T& b)
{
    T result(a);
    return result += b;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.08.2014, 10:46

Перегрузка оператора +
Добрый день)Почему то не работает перегрузка оператора сложения) #include &lt;iostream&gt; #include &lt;string&gt; #include...

Перегрузка оператора
#include &lt;cstring&gt; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; using namespace std; class station { public: ...

Перегрузка оператора new[]
Привет всем, программирую давольно давно, на с++ второй год. Столкнулся с задачей, в которой нужно создать свой класс и корректно в нем...

Перегрузка оператора >
Добрый день! #include &lt;stdio.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream&gt; template &lt;typename T1, typename T2&gt; bool ...

Перегрузка оператора
Имеется код: #include &lt;iostream&gt; class X { public: int a; int b; int operator+(int a) {


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
84
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru