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

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

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

Author24 — интернет-сервис помощи студентам
не получается в своем классе перегрузить оператор + пишет "error C2804: бинарный "operator +" имеет слишком много параметров", действительно задал 2 параметра, но как еще то? ведь + и подразумевает собой сложение 2х значений...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.08.2014, 17:56
Ответы с готовыми решениями:

Перегрузка оператора ^
Здравствуйте! Необходимо перегрузить бинарный оператор ^ для транспонирования матрицы. Есть класс...

Перегрузка оператора +
Написал для перегрузки оператора + class BoolMatrix { private: int feet; public:...

перегрузка оператора!
Помогите сложить диагонали , при помоши перегрузки оператора+, чтобы можно было написать в maine:...

Перегрузка оператора +
Добрый день)Почему то не работает перегрузка оператора сложения) #include <iostream> #include...

83
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
02.08.2014, 18:07 2
Цитата Сообщение от GetHelp Посмотреть сообщение
и подразумевает собой сложение 2х значений...
насколько помню одно то из значений текущий объект т.е this
Цитата Сообщение от GetHelp Посмотреть сообщение
действительно задал 2 параметра,
А он считает что 3
хотя могу ошибаться
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 18:09  [ТС] 3
Цитата Сообщение от ValeryS Посмотреть сообщение
насколько помню одно то из значений текущий объект т.е this
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?
т.е.
C++
1
2
myclass b, c;
myclass a = b + c;
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
02.08.2014, 18:16 4
Цитата Сообщение от GetHelp Посмотреть сообщение
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?
Я же сказал
Цитата Сообщение от ValeryS Посмотреть сообщение
могу ошибаться
давненько не делал
Покажи как перегружаешь?
0
57 / 51 / 42
Регистрация: 18.07.2014
Сообщений: 194
02.08.2014, 18:17 5
Цитата Сообщение от GetHelp Посмотреть сообщение
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?

Сделать дружественный оператор. Как то так:
C++
1
friend SomeClass operator+ ( const SomeClass&, const SomeClass& );
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 18:22  [ТС] 6
Цитата Сообщение от ValeryS Посмотреть сообщение
Покажи как перегружаешь?
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
class String
{
private:
    char* ptr;
    size_t size;
public:
    String() 
    {
        size = 0;
    }
    ~String()
    {
        if (size) delete[] ptr;
    }
    size_t length();
    bool SetLength(size_t NewLength)
    {
        if (!size)
        {
            size = NewLength;
            ptr = (char*)calloc(NewLength, 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 char* str1, const char* str2)
    {
 
    }
};
Добавлено через 3 минуты
Цитата Сообщение от porshe Посмотреть сообщение
Сделать дружественный оператор. Как то так:
пытался в свой код добавить, пишет "error C2803: "operator +" должен иметь по крайней мере один формальный параметр типа класс"
0
Заблокирован
Автор FAQ
02.08.2014, 18:23 7
Цитата Сообщение от GetHelp Посмотреть сообщение
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?
т.е.
- написать перегруженный оператор для всех типов с которыми возможно взаимодействие. На практике это оч геморное занятие, потому стараются перевести результат сложения в какой нибудь из стандратных типов(конечно если это вообще возможно)
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
#include <iostream>
using namespace std;
 
class cClass1
{
    protected:
        double value;
    public:
        cClass1() {
            value = 0;
        }
        double operator + (const cClass1 &pAdd);
        double operator + (const double  &pAdd);
        double GetValue(){return value;}
};
 
double cClass1::operator + (const cClass1 &pAdd){
    return value + pAdd.value;
}
 
double cClass1::operator + (const double  &pAdd){
    return value + pAdd;
}
 
int main(){
    cClass1 p;
    double q = p + 5;
    cout<<q<<endl;
    return 0;
}
http://codepad.org/KDQphwaO
0
57 / 51 / 42
Регистрация: 18.07.2014
Сообщений: 194
02.08.2014, 18:25 8
Цитата Сообщение от GetHelp Посмотреть сообщение
пытался в свой код добавить, пишет "error C2803: "operator +" должен иметь по крайней мере один формальный параметр типа класс"
Покажи как ты добавил
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 18:26  [ТС] 9
Цитата Сообщение от porshe Посмотреть сообщение
Покажи как ты добавил
C++
1
friend const char* operator+ (const char* str1, const char* str2)
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
02.08.2014, 18:31 10
Цитата Сообщение от GetHelp Посмотреть сообщение
const char* operator+ (const char* str1, const char* str2)
а теперь посмотри как определе этот оператор в "классическом" string
http://www.cplusplus.com/refer... operator+/
вернуть ты должен объект класса
и хоть один из аргументов должен быть классом
0
Заблокирован
Автор FAQ
02.08.2014, 18:36 11
GetHelp, нельзя в оператор + впихнуть больше 1-го аргумента и объявить свой оператор на большее число аргументов тоже нельзя, этого сделать язык не позволяет
http://codepad.org/WbXX07Nw
http://ideone.com/lm1na4
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 18:40  [ТС] 12
Цитата Сообщение от ValeryS Посмотреть сообщение
а теперь посмотри как определе этот оператор в "классическом" string
http://www.cplusplus.com/refer... operator+/
если бы я хотел сделать копию классического стринга я бы... нет я бы просто не стал страдать фигней... я пытаюсь сделать более простой вариант строки, основной смысл - максимально добиться функциональности паскалевых строк, т.е. никакой мороки с аллокацией памяти и т.д.
Цитата Сообщение от ValeryS Посмотреть сообщение
вернуть ты должен объект класса
это верно, че то протупил, но ошибка все равно такая же висит...
Цитата Сообщение от ValeryS Посмотреть сообщение
и хоть один из аргументов должен быть классом
а можно хоть как то сделать чтобы складывались именно 2 char*?

Добавлено через 36 секунд
-=ЮрА=-, печаль беда паника
0
57 / 51 / 42
Регистрация: 18.07.2014
Сообщений: 194
02.08.2014, 18:42 13
Цитата Сообщение от GetHelp Посмотреть сообщение
а можно хоть как то сделать чтобы складывались именно 2 char*?
никак, язык не позволяет
0
Заблокирован
Автор FAQ
02.08.2014, 18:45 14
GetHelp, объясни зачем классу строка объявлять оператор сложения для совершенно от него не зависящих классов? У тебя ошибка логики проектирования. Приведи хотябы на словах что ты хочешь сделать или покажи.
0
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
02.08.2014, 18:48  [ТС] 15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
объясни зачем классу строка объявлять оператор сложения для совершенно от него не зависящих классов? У тебя ошибка логики проектирования. Приведи хотябы на словах что ты хочешь сделать или покажи.
в паскале/делфи просто прокатывает такая конструкция:
Delphi
1
2
3
4
Var str: String;
begin
str := 'hello' + 'world';
end;
а поскольку я пытался реализовать именно паскалевские строки я пытался так тоже сделать, но походу увы тут так нельзя
0
Заблокирован
Автор FAQ
02.08.2014, 18:54 16
GetHelp, кто мешает сдлеать тебе следующее
C++
1
String val = String(str1) + str2;
Добавь только конструктор преобразования
1
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
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
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
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
63 / 64 / 11
Регистрация: 27.02.2013
Сообщений: 1,116
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
02.08.2014, 19:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2014, 19:27
Помогаю со студенческими работами здесь

Перегрузка оператора
#include &lt;cstring&gt; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; using namespace std;...

Перегрузка оператора new[]
Привет всем, программирую давольно давно, на с++ второй год. Столкнулся с задачей, в которой нужно...

Перегрузка оператора >
Добрый день! #include &lt;stdio.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream&gt; template &lt;typename...

Перегрузка оператора
Имеется код: #include &lt;iostream&gt; class X { public: int a; int b; int operator+(int a)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru