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

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

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

Перегрузка оператора C++
C++ Перегрузка оператора +=
Перегрузка оператора = C++
Перегрузка оператора * C++
Перегрузка оператора ~ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 19:31     Перегрузка оператора + #21
Цитата Сообщение от GetHelp Посмотреть сообщение
ведь конструктор не возвращает значения...
- зато создаёт готовую сущность к которой применимы все перегруженные опреаторы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 19:46  [ТС]     Перегрузка оператора + #22
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
- зато создаёт готовую сущность к которой применимы все перегруженные опреаторы
но что толку если эту сущность никуда нельзя присвоить?

Добавлено через 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 минут
блин нет, так толку никакого... ибо откуда его вызывать? из той же строки которой присваиваешь? ошибку выкидывает короче хз как тут быть
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
02.08.2014, 19:54     Перегрузка оператора + #23
Еще раз чем не устраивает std::string ?
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 19:55  [ТС]     Перегрузка оператора + #24
Цитата Сообщение от Avazart Посмотреть сообщение
Еще раз чем не устраивает std::string ?
не устраивает и точка, хочу свой класс написать...
Avazart
 Аватар для Avazart
6897 / 5137 / 252
Регистрация: 10.12.2010
Сообщений: 22,579
Записей в блоге: 17
02.08.2014, 19:58     Перегрузка оператора + #25
Цитата Сообщение от porshe Посмотреть сообщение
Сделать дружественный оператор.
Не нужно так делать, тут в этом нет необходимости.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2014, 20:26     Перегрузка оператора + #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
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 20:36  [ТС]     Перегрузка оператора + #27
0x10, странно а у меня ошибку выбивает
C++
1
2
3
4
5
String operator""_s(const char* str)
    {
        String retval(str);
        return str;
    }
error C2833: "operator строка" не является распознаваемым оператором или типом
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2014, 20:40     Перегрузка оператора + #28
Цитата Сообщение от GetHelp Посмотреть сообщение
а у меня ошибку выбивает
Я просто уже не пишу в каждом посте дисклеймер о том, что не гарантирую поддержку всех возможностей языка используемым в конкретном случае компилятором.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 20:43  [ТС]     Перегрузка оператора + #29
Цитата Сообщение от 0x10 Посмотреть сообщение
Я просто уже не пишу в каждом посте дисклеймер о том, что не гарантирую поддержку всех возможностей языка используемым в конкретном случае компилятором.
угу печально это все тут еще проблема в том что как не пиши, а вернуть из функции объект String валидный не выходит потому что применил я допустим конструктор преобразующий, а при выходе из функции вызывается деструктор класса и строка выходит не валидная
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2014, 20:46     Перегрузка оператора + #30
Цитата Сообщение от GetHelp Посмотреть сообщение
тут еще проблема в том что как не пиши, а вернуть из функции объект String валидный не выходит
Я по коду не вижу ни конструктора копирования, ни оператора присваивания для класса. Сгенеренные компилятором версии ничего не знают про управление памятью и копируют значения указателей побитово.
GetHelp
-8 / 60 / 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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2014, 21:01     Перегрузка оператора + #32
Цитата Сообщение от GetHelp Посмотреть сообщение
String(const char* str)
Шаблон сигнатуры конструктора копирования можно записать как T(const T& obj);
Обратить внимание на то, что под Т должен быть один и тот же тип (не совсем корректно такое объяснение, но для краткости сойдет).
Сигнатуру и пример реализации оператора присваивания тоже не помешало бы посмотреть в учебнике.
GetHelp
-8 / 60 / 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
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2014, 21:06     Перегрузка оператора + #34
Цитата Сообщение от GetHelp Посмотреть сообщение
только опять те же ошибки что и с оператором присваивания
У константного аргумента вызываются неконстантные методы length и allocator (кстати, почему он так назван? он возвращает не аллокатор).
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:10  [ТС]     Перегрузка оператора + #35
Цитата Сообщение от 0x10 Посмотреть сообщение
У константного аргумента вызываются неконстантные методы length и allocator
как это не константные? они же ничего не меняют...
Цитата Сообщение от 0x10 Посмотреть сообщение
кстати, почему он так назван? он возвращает не аллокатор
а что в вашем понимании аллокатор? в моем - выделенный блок памяти... ну ладно могу назвать метод pointer
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2014, 21:14     Перегрузка оператора + #36
Цитата Сообщение от GetHelp Посмотреть сообщение
как это не константные? они же ничего не меняют...
Формально сигнатура константного метода записывается как return_type method_name() const;

Цитата Сообщение от GetHelp Посмотреть сообщение
а что в вашем понимании аллокатор?
В терминологии стандатрной библиотеки - сущность, инкапсулирующая операции работы с памятью (выделение, освобождение, и т д).
Метод, возвращающий указатель на внутренние данные, в стандартных контейнерах назван просто - data();
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 21:18  [ТС]     Перегрузка оператора + #37
Цитата Сообщение от 0x10 Посмотреть сообщение
Формально сигнатура константного метода записывается как return_type method_name() const;
то что я дописал в этих функциях const перед результатом ровным счетом ничего не изменило все те же ошибки...
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
02.08.2014, 21:21     Перегрузка оператора + #38
C++
1
2
3
4
size_t length() const
{
        return size;
}
В общем случае на каждом этапе нужен окончательный и полный вариант кода вместе с текстом ошибок.
ValeryS
Модератор
6374 / 4840 / 442
Регистрация: 14.02.2011
Сообщений: 16,043
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);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 21:26     Перегрузка оператора +
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
GetHelp
-8 / 60 / 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
Yandex
Объявления
02.08.2014, 21:26     Перегрузка оператора +
Ответ Создать тему
Опции темы

Текущее время: 14:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru