Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

Перегрузка оператора + - C++
Всем привет, проблема на этот раз такая. Для того, чтобы выучить классы, я пишу некое подобие класса string. Сложность вот в чем. Возникла...

Перегрузка оператора [] - C++
Здравствуйте. Пробую перегрузить оператор . template <class Element> class List { public: struct Node { Element el; ...

Перегрузка оператора = - C++
Доброго времени суток,не могу понять в чем проблема. Есть класс,в котором переопределен оператор +, есть массив классов, при попытке...

Перегрузка оператора *= - C++
Переписываю свой матричный калькулятор и решил внести в него перегрузку оператора *= Matrix* Matrix::operator *=(double num){ ...

Перегрузка оператора << - C++
Здравствуйте! Подскажите, пожалуйста, как выполнить перегрузку оператора &lt;&lt;? Для двух классов: class A { public:

перегрузка оператора [] - C++
объясните в 3х словах для ламера в чем смысл перегрузки, конкретно оператора

Перегрузка оператора - C++
Доброго времени суток. Столкнулся с проблемой перегрузки оператора &quot;++&quot; выдает ошибку в первой строке: postfix ‘const Counter...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:00  [ТС]     Перегрузка оператора + #31
Цитата Сообщение от 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? сейчас попробую накидать
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
02.08.2014, 21:01     Перегрузка оператора + #32
Цитата Сообщение от GetHelp Посмотреть сообщение
String(const char* str)
Шаблон сигнатуры конструктора копирования можно записать как T(const T& obj);
Обратить внимание на то, что под Т должен быть один и тот же тип (не совсем корректно такое объяснение, но для краткости сойдет).
Сигнатуру и пример реализации оператора присваивания тоже не помешало бы посмотреть в учебнике.
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:04  [ТС]     Перегрузка оператора + #33
вот
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);
ок переписал со ссылкой, ошибки не исчезли
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
02.08.2014, 21:06     Перегрузка оператора + #34
Цитата Сообщение от GetHelp Посмотреть сообщение
только опять те же ошибки что и с оператором присваивания
У константного аргумента вызываются неконстантные методы length и allocator (кстати, почему он так назван? он возвращает не аллокатор).
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:10  [ТС]     Перегрузка оператора + #35
Цитата Сообщение от 0x10 Посмотреть сообщение
У константного аргумента вызываются неконстантные методы length и allocator
как это не константные? они же ничего не меняют...
Цитата Сообщение от 0x10 Посмотреть сообщение
кстати, почему он так назван? он возвращает не аллокатор
а что в вашем понимании аллокатор? в моем - выделенный блок памяти... ну ладно могу назвать метод pointer
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
02.08.2014, 21:14     Перегрузка оператора + #36
Цитата Сообщение от GetHelp Посмотреть сообщение
как это не константные? они же ничего не меняют...
Формально сигнатура константного метода записывается как return_type method_name() const;

Цитата Сообщение от GetHelp Посмотреть сообщение
а что в вашем понимании аллокатор?
В терминологии стандатрной библиотеки - сущность, инкапсулирующая операции работы с памятью (выделение, освобождение, и т д).
Метод, возвращающий указатель на внутренние данные, в стандартных контейнерах назван просто - data();
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:18  [ТС]     Перегрузка оператора + #37
Цитата Сообщение от 0x10 Посмотреть сообщение
Формально сигнатура константного метода записывается как return_type method_name() const;
то что я дописал в этих функциях const перед результатом ровным счетом ничего не изменило все те же ошибки...
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
02.08.2014, 21:21     Перегрузка оператора + #38
C++
1
2
3
4
size_t length() const
{
        return size;
}
В общем случае на каждом этапе нужен окончательный и полный вариант кода вместе с текстом ошибок.
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
02.08.2014, 21:26     Перегрузка оператора + #39
Цитата Сообщение от GetHelp Посмотреть сообщение
size = str.length();
А зачем ты здесь вызываешь метод???
можно так
C++
1
size = str.size;
Цитата Сообщение от GetHelp Посмотреть сообщение
strcpy(ptr, str.allocator());
C++
1
strcpy(ptr, str.ptr);
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:26  [ТС]     Перегрузка оператора + #40
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
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
02.08.2014, 21:28     Перегрузка оператора + #41
Цитата Сообщение от GetHelp Посмотреть сообщение
Необработанное исключение по адресу 0x77ED40E3 (msvcr120d.dll) в string.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xCCCCCCCC."
где то память не выделилась
указатель есть но указывает в космос
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:29  [ТС]     Перегрузка оператора + #42
Цитата Сообщение от ValeryS Посмотреть сообщение
А зачем ты здесь вызываешь метод???
можно так
C++
1
size = str.size;
Цитата Сообщение от ValeryS Посмотреть сообщение
C++
1
strcpy(ptr, str.ptr);
ну может потому что у меня size и ptr не в protected секции... хотя возможно действительно есть смысл их туда перенести...
ValeryS
Модератор
6551 / 5017 / 463
Регистрация: 14.02.2011
Сообщений: 16,737
02.08.2014, 21:32     Перегрузка оператора + #43
Цитата Сообщение от GetHelp Посмотреть сообщение
ну может потому что у меня size и ptr не в protected секции...
класс обращается сам к себе
может лезть куда угодно, даже к приватным
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
02.08.2014, 21:32     Перегрузка оператора + #44
Цитата Сообщение от GetHelp Посмотреть сообщение
у меня size и ptr не в protected секции
protected - имеет смысл в случае иерархии. Тут класс один -> нет повода для протектеда совсем.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 21:34     Перегрузка оператора +
Еще ссылки по теме:

Перегрузка оператора [][] - C++
добрый день. имею в классе двумерный массив. подскажите как правильно сделать перегрузку к классу, чтоб при ЭкземлплярКлассa...

Перегрузка оператора - C++
Здравствуйте! Помогите разобраться с перегрузкой операторов. Суть задания: Осуществите перегрузку оператора “++” так, чтобы при его...

Перегрузка оператора == - C++
Пытаюсь перегрузить оператор == . Делаю так: В классе: class cData // класс дата { int year; // год short mounth; //...

Перегрузка оператора = - C++
Здравствуйте, возникла проблема при перегрузке оператора. const digit &amp;operator=( const int &amp; ); const digit &amp;operator=( const char...

Перегрузка оператора -> - C++
обясните пожалуйста как перегружать -&gt; и для чего это нужно


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

Или воспользуйтесь поиском по форуму:
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:34  [ТС]     Перегрузка оператора + #45
Цитата Сообщение от ValeryS Посмотреть сообщение
класс обращается сам к себе
может лезть куда угодно, даже к приватным
str передана в параметре, класс обращается не сам к себе а к другому объекту того же класса

Добавлено через 54 секунды
Цитата Сообщение от 0x10 Посмотреть сообщение
protected - имеет смысл в случае иерархии. Тут класс один -> нет повода для протектеда совсем.
если не будет protected то как ты будешь к str обращаться? нету там доступа к private членам...
Yandex
Объявления
02.08.2014, 21:34     Перегрузка оператора +
Ответ Создать тему
Опции темы

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