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

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

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

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

02.08.2014, 17:56. Просмотров 2419. Ответов 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, 18:54 #16
GetHelp, кто мешает сдлеать тебе следующее
C++
1
String val = String(str1) + str2;
Добавь только конструктор преобразования
1
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
02.08.2014, 18:56 #17
Цитата Сообщение от GetHelp Посмотреть сообщение
а поскольку я пытался реализовать именно паскалевские строки
в паскале в начале строки стоит размер а потом массив символов
а в Си массив символов а потом завершающий 0
а у тебя
Цитата Сообщение от GetHelp Посмотреть сообщение
* * char* ptr;
* * size_t size;
указатель а потом размер
нужно что то типа
C++
1
2
3
4
5
struct PasString
{
unsigned char size;
unsigned char[0];
}
но как ты собираешься с этим работать?
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 19:02  [ТС] #18
-=ЮрА=-, ну похоже так и придется делать...

Добавлено через 2 минуты
ValeryS, я знаю про это, но в том и плюс строк что у них есть завершающий нуль, что дает возможность узнать их размер... нет, я не хочу в этом плане копировать паскалевскую организацию массивов... размер у меня определен внутри класса и по требованию можно его узнать или даже сделать strlen от элемента класса...

Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
C++
1
String val = String(str1) + str2;
да все решено, это самый подходящий вариант спс
0
-=ЮрА=-
02.08.2014, 19:06
  #19

Не по теме:

GetHelp, это тебя успокоить в правильности твоего решения
http://codepad.org/V3hFNQ7Y
http://codepad.org/IBGExwrm

Цитата Сообщение от GetHelp Посмотреть сообщение
да все решено, это самый подходящий вариант спс
- думаю для такой постановки задачи он единственный - левый из операндов надо преобразовывать

0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 19:27  [ТС] #20
-=ЮрА=-, а все таки я опять не понимаю как это должно работать? ведь конструктор не возвращает значения...

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
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()
    {
        if (size) delete[] ptr;
    }
    size_t length()
    {
        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) delete[] ptr;
        size = strlen(str);
        ptr = new char[size + 1];
        strcpy(ptr, str);
        return str;
    }
    /*const char* operator= (const String str)
    {
        if (size) delete[] ptr;
        size = str.length();
    }*/
    const String operator+ (const char* str)
    {
        char* tmp = (char*)calloc(size + strlen(str) + 1, sizeof(char));
        strcpy(tmp, ptr);
        strcat(tmp, str);
        return String(tmp);
    }
};
0
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 19:31 #21
Цитата Сообщение от GetHelp Посмотреть сообщение
ведь конструктор не возвращает значения...
- зато создаёт готовую сущность к которой применимы все перегруженные опреаторы
0
GetHelp
-7 / 61 / 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 минут
блин нет, так толку никакого... ибо откуда его вызывать? из той же строки которой присваиваешь? ошибку выкидывает короче хз как тут быть
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
02.08.2014, 19:54 #23
Еще раз чем не устраивает std::string ?
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 19:55  [ТС] #24
Цитата Сообщение от Avazart Посмотреть сообщение
Еще раз чем не устраивает std::string ?
не устраивает и точка, хочу свой класс написать...
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,054
Записей в блоге: 17
02.08.2014, 19:58 #25
Цитата Сообщение от porshe Посмотреть сообщение
Сделать дружественный оператор.
Не нужно так делать, тут в этом нет необходимости.
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
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
0
GetHelp
-7 / 61 / 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 строка" не является распознаваемым оператором или типом
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
02.08.2014, 20:40 #28
Цитата Сообщение от GetHelp Посмотреть сообщение
а у меня ошибку выбивает
Я просто уже не пишу в каждом посте дисклеймер о том, что не гарантирую поддержку всех возможностей языка используемым в конкретном случае компилятором.
0
GetHelp
-7 / 61 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 20:43  [ТС] #29
Цитата Сообщение от 0x10 Посмотреть сообщение
Я просто уже не пишу в каждом посте дисклеймер о том, что не гарантирую поддержку всех возможностей языка используемым в конкретном случае компилятором.
угу печально это все тут еще проблема в том что как не пиши, а вернуть из функции объект String валидный не выходит потому что применил я допустим конструктор преобразующий, а при выходе из функции вызывается деструктор класса и строка выходит не валидная
0
0x10
2479 / 1654 / 248
Регистрация: 24.11.2012
Сообщений: 4,099
02.08.2014, 20:46 #30
Цитата Сообщение от GetHelp Посмотреть сообщение
тут еще проблема в том что как не пиши, а вернуть из функции объект String валидный не выходит
Я по коду не вижу ни конструктора копирования, ни оператора присваивания для класса. Сгенеренные компилятором версии ничего не знают про управление памятью и копируют значения указателей побитово.
0
02.08.2014, 20:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 20:46
Привет! Вот еще темы с ответами:

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


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

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

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