С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 4.94
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
#1

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

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

не получается в своем классе перегрузить оператор + пишет "error C2804: бинарный "operator +" имеет слишком много параметров", действительно задал 2 параметра, но как еще то? ведь + и подразумевает собой сложение 2х значений...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.08.2014, 17:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора + (C++):

Перегрузка оператора ‘=’ - C++
Подскажите, пожалуйста, можно ли как-то перегрузить оператор равно. Чтобы можно было его использовать как с правой, так и с левой...

Перегрузка оператора << - C++
Есть такой код. class matrix { public: ......; const double* operator(int) const; double* const operator(int); friend...

Перегрузка оператора - C++
Добрый день! Мне нужно перегрузить в классе двумерного массива оператор ++, чтобы она возвращал максимальный элемент массива. класс...

Перегрузка оператора + - C++
Не могу заставить работать перегруженный оператор + в функции CMoveByVector Point.h: #define POINT_H #include &lt;iostream&gt; ...

Перегрузка оператора = - C++
Ввести строку символов S1. Программа должна содержать перегруженную операцию “=”, использование которой скопирует S1 в S2 при следующих...

Перегрузка оператора + - C++
Помогите с перегрузкой оператора +. Нужно сложить два объекта - двумерные массивы. сArray operator + (сArray &amp;arr) { int size...

83
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 22:14 #61
Цитата Сообщение от GetHelp Посмотреть сообщение
-=ЮрА=-, так уже интересно, кое что полезное взял, но не могу протестить, вы забыли дописать перегрузку оператора присваивания на ней у меня как раз сейчас все стопорится... а она точно нужна...
http://codepad.org/Vz17krvX
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
String operator = (const char * str){
        if( text )
            delete text;
        if( str )
        {
            size = strlen(str);
            text = new char[1 + size];
            size = sprintf(text, "%s", str);
            text[size] = 0;
        }
        else
        {
            text = 0;
            size = 0;
        }
        return *this;
    }
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
02.08.2014, 22:15 #62
Цитата Сообщение от GetHelp Посмотреть сообщение
хз я где то читал вроде что delete вызывает free сама...
это разные сущности, хотя и может delete вызывать free, а может не вызывать зависит от компилятора
Цитата Сообщение от GetHelp Посмотреть сообщение
я же показал... так и стоит и никуда не двигается
знаешь мне трудно как то по скриншотам сориентироваться
могу предложить другой путь
"отладочная печать"
после каждого выделения памяти печатаешь на экран значение указателя
например
C++
1
2
ptr = (char*)calloc(size + 1, sizeof(char))
 printf ("Copy constructor ptr=%x",ptr);
да и calloc это не new в случае неудачи исключение не бросит
так что нужно проверять
C++
1
2
3
ptr = (char*)calloc(size + 1, sizeof(char))
   if(ptr==NULL) printf("Error");
 printf ("Copy constructor ptr=%x",ptr);
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 22:19  [ТС] #63
Цитата Сообщение от Tulosba Посмотреть сообщение
А вот это уже похоже на правду В плюсах постарайтесь забыть про malloc/free.
не могу забыть я лучше забуду в этом классе об new/delete просто очень уж удобная штука realloc, потому что она меняет размер, да еще и копирует элементы при этом
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
02.08.2014, 22:21 #64
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
2
if( text )
* * * * * * delete text;
Говорили же уже, что не надо такую проверку делать перед delete. Лучше бы после new проверку добавил, было бы полезнее.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
size = sprintf(text, "%s", str);
strcpy() уже запретили? А учитывая наличие определенной ранее длины можно и вовсе memcpy обойтись.
Копировать одну строку в другую через sprintf - достойно говнокода.
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
String operator = (const char * str){
Ссылку надо возвращать, а не копию.
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 22:21 #65
Цитата Сообщение от GetHelp Посмотреть сообщение
просто очень уж удобная штука realloc, потому что она меняет размер, да еще и копирует элементы при этом
- нельзя её в плюсах юзать, риаллок из С-ей где совсем другой механизм обработки ошибок, тут вынужден признать, вам "слеует послушать человека который не знает что такое препроцессор" выше
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 22:22  [ТС] #66
так... сейчас у меня код такой выходит
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
#include <string>
 
class String
{
private:
    char* ptr;
    size_t size;
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.size;
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str.ptr);
    }
    ~String()
    {
        if (size) free(ptr);
    }
    size_t length() const
    {
        return size;
    }
    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) free(ptr);
        size = strlen(str);
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str);
        return str;
    }
    const String operator= (const String& str)
    {
        return operator+ (str.ptr);
    }
    const String operator+ (const char* str)
    {
        size = size + strlen(str) + 1;
        char* tmp = ptr;
        ptr = (char*)calloc(size, sizeof(char));
        strcpy(ptr, tmp);
        free(tmp);
        strcat(ptr, str);
        return *this;
    }
};
кстати ошибки пропали... но теперь не корректно просто сложение работает... например вызываю так
C++
1
2
String str("hello");
str = str + "world";
он мне в str записывает аж 20 символов, там все время повторяется helloworldhelloworld... что бы это значило?
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 22:24 #67
GetHelp, убери realloc это действительно важно, хоть и удобно. Его нельзя даже если очень хочется
Цитата Сообщение от GetHelp Посмотреть сообщение
const String operator= (const String& str)
* * {
* * * * return operator+ (str.ptr);
* * }
- убери, юзай КК!
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
02.08.2014, 22:26 #68
Цитата Сообщение от GetHelp Посмотреть сообщение
он мне в str записывает аж 20 символов, там все время повторяется helloworldhelloworld... что бы это значило?
рекурсия однако
сам посмотри что будет, по шагам пройди
нужно предусматривать вариант, когда один аргумент является одновременно и приемником результат
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 22:26  [ТС] #69
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
убери realloc это действительно важно, хоть и удобно. Его нельзя даже если очень хочется
ладно я попробую что нибудь с этим сделать...
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- убери, юзай КК!
что юзать?
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 22:27 #70
Цитата Сообщение от GetHelp Посмотреть сообщение
что юзать?
- конструктор копирования, который был изначально
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 22:39  [ТС] #71
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- конструктор копирования, который был изначально
C++
1
2
3
4
5
6
String(const String& str)
    {
        size = str.size;
        ptr = (char*)calloc(size + 1, sizeof(char));
        strcpy(ptr, str.ptr);
    }
этот? как и где его юзать? вы вообще о чем?

вообще я кажется понял что мне нужно, но не знаю как реализовать... мне надо все также перегрузить оператор сложения, НО не менять при этом this и при этом ухитриться вернуть из функции экземпляр String (это самое сложное, поскольку он по прежнему не валиден ) таким образом будет именно сложение, как я понял именно поэтому у меня не хочет нормально складывать...
0
0x10
2486 / 1661 / 249
Регистрация: 24.11.2012
Сообщений: 4,139
02.08.2014, 22:40 #72
Цитата Сообщение от GetHelp Посмотреть сообщение
этот? как и где его юзать? вы вообще о чем?
Речь об идиоме copy-and-swap (гуглится и, опять же, в книгах описана).
0
DrOffset
7377 / 4454 / 1009
Регистрация: 30.01.2014
Сообщений: 7,304
02.08.2014, 22:41 #73
GetHelp, миллион советов уже тебе дали по конкретике, не буду повторяться.
Скажу одно, основная и главная проблема твоя в подходе к написанию кода. То, что ошибки ты сейчас самостоятельно или с помощью форумчан, исправишь - это понятно и хорошо. Но вот самый главный шаг нужно с делать в сторону того, чтобы ошибок было изначально меньше.
Начни с разделения ответственности. У тебя есть задача, задача делится на составные части. Каждую составную часть нужно описать отдельно и отдельно оттестировать, а потом собирать все воедино как конструктор. Т.е., вот скажем функция выделения памяти, она у тебя, что называется, прошита во все методы, где используется. каждый раз нужно высчитывать размер умножая на sizeof(char), каждый раз заботиться о проверке, каждый раз смотреть, чтобы указатель не попортился и т.д. Где-то можно что-то и забыть или не так посчитать. В нормальных контейнерах функцию выделения памяти обычно абстрагируют во внутреннюю функцию allocate, а освобождение, соответственно, в deallocate. Инициализация - это тоже отдельная операция. Копирование - тоже. И т.д. Принцип divide et impera очень древний и очень действенный. Не стоит пренебрегать им.
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 22:45 #74
Цитата Сообщение от GetHelp Посмотреть сообщение
этот? как и где его юзать? вы вообще о чем?
когда запишешь
String str = String("text") + "data";
Вызовется - КП (коснтруктор преобразования) String("text")
Сработает перегруженный оператор + Strig + char
Сработает КК для str
Если бы стоял оператор присваивания String operator = String мы бы дёрнули делитом битый поинтер text
Касательно кажущегося ликиджа
str = str + "text" его не будет т.к отработает дефолтный String operator = String который по сути присвоит классу самого себя
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 22:53  [ТС] #75
Цитата Сообщение от DrOffset Посмотреть сообщение
GetHelp, миллион советов уже тебе дали по конкретике, не буду повторяться.
Скажу одно, основная и главная проблема твоя в подходе к написанию кода. То, что ошибки ты сейчас самостоятельно или с помощью форумчан, исправишь - это понятно и хорошо. Но вот самый главный шаг нужно с делать в сторону того, чтобы ошибок было изначально меньше.
Начни с разделения ответственности. У тебя есть задача, задача делится на составные части. Каждую составную часть нужно описать отдельно и отдельно оттестировать, а потом собирать все воедино как конструктор. Т.е., вот скажем функция выделения памяти, она у тебя, что называется, прошита во все методы, где используется. каждый раз нужно высчитывать размер умножая на sizeof(char), каждый раз заботиться о проверке, каждый раз смотреть, чтобы указатель не попортился и т.д. Где-то можно что-то и забыть или не так посчитать. В нормальных контейнерах функцию выделения памяти обычно абстрагируют во внутреннюю функцию allocate, а освобождение, соответственно, в deallocate. Инициализация - это тоже отдельная операция. Копирование - тоже. И т.д. Принцип divide et impera очень древний и очень действенный. Не стоит пренебрегать им.
не понимаю что конкретно вы имеете ввиду под функциями выделения и освобождения памяти... что толку если я напишу скажем
C++
1
2
3
4
char* allocate(size_t size)
{
return (char*) calloc(size, sizeof(char));
}
что толку? чуть меньше писать при вызове? про остальное тоже самое...

Добавлено через 2 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
когда запишешь
String str = String("text") + "data";
Вызовется - КП (коснтруктор преобразования) String("text")
Сработает перегруженный оператор + Strig + char
Сработает КК для str
Если бы стоял оператор присваивания String operator = String мы бы дёрнули делитом битый поинтер text
Касательно кажущегося ликиджа
str = str + "text" его не будет т.к отработает дефолтный String operator = String который по сути присвоит классу самого себя
не понимаю о чем вы вы понимаете что КП не возвращает значения? конструкторы вообще не могут возвращать значение ! что именно вы пытаетесь складывать? в конечно счете вы просто присваиваете str = "data"

Добавлено через 3 минуты
т.е. КП вызванный из неоткуда ничего и не дает, вы же не вызываете его от переменной...
0
02.08.2014, 22:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 22:53
Привет! Вот еще темы с ответами:

Перегрузка оператора << - C++
Пишу класс My_String #include &lt;iostream&gt; const int MAX = 1000; class My_String { private: char str; public:

Перегрузка оператора += - C++
Есть два класса: Vec4(вектор из 4х float) и Mat4(вектор из 4х Vec4). Проблема в том что при перегрузке в Mat4 операции += я получаю ошибку...

Перегрузка оператора = - C++
Здравствуйте! При попытке заменить объект пользовательского класса q4 на q6 в контейнере set появляется ошибка: error C2678: binary '=' :...

Перегрузка оператора - C++
Здравствуйте, друзья. Помогите пожалуйста найти ошибку, вернее я знаю где, но пока не понимаю как её исправить: //Добавить в строковый...


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

Или воспользуйтесь поиском по форуму:
75
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.