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

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

02.08.2014, 17:56. Показов 8291. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru