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

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

02.08.2014, 17:56. Показов 8052. Ответов 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
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
02.08.2014, 19:31
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от GetHelp Посмотреть сообщение
ведь конструктор не возвращает значения...
- зато создаёт готовую сущность к которой применимы все перегруженные опреаторы
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 19:46  [ТС]
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- зато создаёт готовую сущность к которой применимы все перегруженные опреаторы
но что толку если эту сущность никуда нельзя присвоить?

Добавлено через 1 минуту
единственное где я ее заюзал, исправил

C++
1
2
3
4
5
6
7
8
    const String operator+ (const char* str)
    {
        char* tmp = (char*)calloc(size + strlen(str) + 1, sizeof(char));
        strcpy(tmp, ptr);
        strcat(tmp, str);
        String retval(tmp);
        return retval;
    }
Добавлено через 1 минуту
но все равно написать так нельзя увы
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
String val = String(str1) + str2;
Добавлено через 1 минуту
может сделать что то типа вот такого метода?
C++
1
String ToString(const char* str)
Добавлено через 8 минут
блин нет, так толку никакого... ибо откуда его вызывать? из той же строки которой присваиваешь? ошибку выкидывает короче хз как тут быть
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2014, 19:54
Еще раз чем не устраивает std::string ?
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 19:55  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Еще раз чем не устраивает std::string ?
не устраивает и точка, хочу свой класс написать...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.08.2014, 19:58
Цитата Сообщение от porshe Посмотреть сообщение
Сделать дружественный оператор.
Не нужно так делать, тут в этом нет необходимости.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 20:26
Цитата Сообщение от GetHelp Посмотреть сообщение
в паскале/делфи просто прокатывает такая конструкция:
str := 'hello' + 'world';
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
 
std::string operator"" _s(const char* str, unsigned size) {
    return std::string(str, size);
}
 
int main() {
    std::string str = "abc"_s + "def"_s;
    std::cout << str << std::endl;
}
http://ideone.com/nNnzXl
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 20:36  [ТС]
0x10, странно а у меня ошибку выбивает
C++
1
2
3
4
5
String operator""_s(const char* str)
    {
        String retval(str);
        return str;
    }
error C2833: "operator строка" не является распознаваемым оператором или типом
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 20:40
Цитата Сообщение от GetHelp Посмотреть сообщение
а у меня ошибку выбивает
Я просто уже не пишу в каждом посте дисклеймер о том, что не гарантирую поддержку всех возможностей языка используемым в конкретном случае компилятором.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 20:43  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Я просто уже не пишу в каждом посте дисклеймер о том, что не гарантирую поддержку всех возможностей языка используемым в конкретном случае компилятором.
угу печально это все тут еще проблема в том что как не пиши, а вернуть из функции объект String валидный не выходит потому что применил я допустим конструктор преобразующий, а при выходе из функции вызывается деструктор класса и строка выходит не валидная
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 20:46
Цитата Сообщение от GetHelp Посмотреть сообщение
тут еще проблема в том что как не пиши, а вернуть из функции объект String валидный не выходит
Я по коду не вижу ни конструктора копирования, ни оператора присваивания для класса. Сгенеренные компилятором версии ничего не знают про управление памятью и копируют значения указателей побитово.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 21:00  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
ни конструктора копирования
C++
1
2
3
4
5
6
String(const char* str)
    {
        size = strlen(str);
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str);
    }
Цитата Сообщение от 0x10 Посмотреть сообщение
ни оператора присваивания для класса
с этим сложнее, почему то такая конструкция не прокатывает
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
#include <string>
 
class String
{
private:
    char* ptr;
    size_t size;
protected:
    char* allocator()
    {
        return ptr;
    }
public:
    String() 
    {
        size = 0;
    }
    String(const char* str)
    {
        size = strlen(str);
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str);
    }
    ~String()
    {
        if (size) delete[] ptr;
    }
    size_t length()
    {
        return size;
    }
    /*String operator""_s(const char* str)
    {
        String retval(str);
        return str;
    }*/
    bool SetLength(size_t NewLength)
    {
        if (!size)
        {
            size = NewLength;
            ptr = (char*)calloc(size, sizeof(char));
        }
        else
        {
            size = NewLength;
            ptr = (char*)realloc(ptr, size * sizeof(char));
        }
        return true;
    }
    const char operator[] (size_t index)
    {
        return ptr[index];
    }
    const char* operator= (const char* str)
    {
        if (size) delete[] ptr;
        size = strlen(str);
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str);
        return str;
    }
    const String operator= (const String str)
    {
        if (size) delete[] ptr;
        size = str.length();
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str.allocator());
        return str;
    }
    const String operator+ (const char* str)
    {
        char* tmp = (char*)calloc(size + strlen(str) + 1, sizeof(char));
        strcpy(tmp, ptr);
        strcat(tmp, str);
        String retval(tmp);
        return retval;
    }
};
пишет error C2662: size_t String::length(void): невозможно преобразовать указатель "this" из "const String" в "String &"

Добавлено через 5 минут
Цитата Сообщение от 0x10 Посмотреть сообщение
ни конструктора копирования
ааа ясно, который инициализируется объектом String? сейчас попробую накидать
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 21:01
Цитата Сообщение от GetHelp Посмотреть сообщение
String(const char* str)
Шаблон сигнатуры конструктора копирования можно записать как T(const T& obj);
Обратить внимание на то, что под Т должен быть один и тот же тип (не совсем корректно такое объяснение, но для краткости сойдет).
Сигнатуру и пример реализации оператора присваивания тоже не помешало бы посмотреть в учебнике.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 21:04  [ТС]
вот
C++
1
2
3
4
5
6
String(const String& str)
    {
        size = str.length();
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str.allocator());
    }
только опять те же ошибки что и с оператором присваивания

Добавлено через 2 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
Шаблон сигнатуры конструктора копирования можно записать как T(const T& obj);
ок переписал со ссылкой, ошибки не исчезли
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 21:06
Цитата Сообщение от GetHelp Посмотреть сообщение
только опять те же ошибки что и с оператором присваивания
У константного аргумента вызываются неконстантные методы length и allocator (кстати, почему он так назван? он возвращает не аллокатор).
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 21:10  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
У константного аргумента вызываются неконстантные методы length и allocator
как это не константные? они же ничего не меняют...
Цитата Сообщение от 0x10 Посмотреть сообщение
кстати, почему он так назван? он возвращает не аллокатор
а что в вашем понимании аллокатор? в моем - выделенный блок памяти... ну ладно могу назвать метод pointer
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 21:14
Цитата Сообщение от GetHelp Посмотреть сообщение
как это не константные? они же ничего не меняют...
Формально сигнатура константного метода записывается как return_type method_name() const;

Цитата Сообщение от GetHelp Посмотреть сообщение
а что в вашем понимании аллокатор?
В терминологии стандатрной библиотеки - сущность, инкапсулирующая операции работы с памятью (выделение, освобождение, и т д).
Метод, возвращающий указатель на внутренние данные, в стандартных контейнерах назван просто - data();
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 21:18  [ТС]
Цитата Сообщение от 0x10 Посмотреть сообщение
Формально сигнатура константного метода записывается как return_type method_name() const;
то что я дописал в этих функциях const перед результатом ровным счетом ничего не изменило все те же ошибки...
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
02.08.2014, 21:21
C++
1
2
3
4
size_t length() const
{
        return size;
}
В общем случае на каждом этапе нужен окончательный и полный вариант кода вместе с текстом ошибок.
1
Модератор
Эксперт по электронике
8982 / 6749 / 921
Регистрация: 14.02.2011
Сообщений: 23,876
02.08.2014, 21:26
Цитата Сообщение от GetHelp Посмотреть сообщение
size = str.length();
А зачем ты здесь вызываешь метод???
можно так
C++
1
size = str.size;
Цитата Сообщение от GetHelp Посмотреть сообщение
strcpy(ptr, str.allocator());
C++
1
strcpy(ptr, str.ptr);
1
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 21:26  [ТС]
0x10, ух ты ж нефига себе я первый раз вижу чтобы const так писали... но как ни странно помогло спс, ошибок стало меньше, но что то все же не так...
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
#include <string>
 
class String
{
private:
    char* ptr;
    size_t size;
protected:
    char* data() const
    {
        return ptr;
    }
public:
    String() 
    {
        size = 0;
    }
    String(const char* str)
    {
        size = strlen(str);
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str);
    }
    /*String(const String& str)
    {
        size = str.length();
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str.allocator());
    }*/
    ~String()
    {
        if (size) delete[] ptr;
    }
    size_t length() const
    {
        return size;
    }
    /*String operator""_s(const char* str)
    {
        String retval(str);
        return str;
    }*/
    bool SetLength(size_t NewLength)
    {
        if (!size)
        {
            size = NewLength;
            ptr = (char*)calloc(size, sizeof(char));
        }
        else
        {
            size = NewLength;
            ptr = (char*)realloc(ptr, size * sizeof(char));
        }
        return true;
    }
    const char operator[] (size_t index)
    {
        return ptr[index];
    }
    const char* operator= (const char* str)
    {
        if (size) delete[] ptr;
        size = strlen(str);
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str);
        return str;
    }
    const String& operator= (const String& str)
    {
        if (size) delete[] ptr;
        size = str.length();
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str.data());
        return str;
    }
    const String& operator+ (const char* str)
    {
        char* tmp = (char*)calloc(size + strlen(str) + 1, sizeof(char));
        strcpy(tmp, ptr);
        strcat(tmp, str);
        String retval(tmp);
        return retval;
    }
};
выкидывает "Необработанное исключение по адресу 0x77ED40E3 (msvcr120d.dll) в string.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC." на строке 74
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2014, 21:26

Перегрузка оператора +
Добрый день)Почему то не работает перегрузка оператора сложения) #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) {


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
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 и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru