Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
02.08.2014, 18:07     Перегрузка оператора + #2
Цитата Сообщение от GetHelp Посмотреть сообщение
и подразумевает собой сложение 2х значений...
насколько помню одно то из значений текущий объект т.е this
Цитата Сообщение от GetHelp Посмотреть сообщение
действительно задал 2 параметра,
А он считает что 3
хотя могу ошибаться
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 18:09  [ТС]     Перегрузка оператора + #3
Цитата Сообщение от ValeryS Посмотреть сообщение
насколько помню одно то из значений текущий объект т.е this
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?
т.е.
C++
1
2
myclass b, c;
myclass a = b + c;
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
02.08.2014, 18:16     Перегрузка оператора + #4
Цитата Сообщение от GetHelp Посмотреть сообщение
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?
Я же сказал
Цитата Сообщение от ValeryS Посмотреть сообщение
могу ошибаться
давненько не делал
Покажи как перегружаешь?
porshe
 Аватар для porshe
52 / 46 / 17
Регистрация: 18.07.2014
Сообщений: 194
02.08.2014, 18:17     Перегрузка оператора + #5
Цитата Сообщение от GetHelp Посмотреть сообщение
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?

Сделать дружественный оператор. Как то так:
C++
1
friend SomeClass operator+ ( const SomeClass&, const SomeClass& );
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
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 +" должен иметь по крайней мере один формальный параметр типа класс"
-=ЮрА=-
Заблокирован
Автор 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
porshe
 Аватар для porshe
52 / 46 / 17
Регистрация: 18.07.2014
Сообщений: 194
02.08.2014, 18:25     Перегрузка оператора + #8
Цитата Сообщение от GetHelp Посмотреть сообщение
пытался в свой код добавить, пишет "error C2803: "operator +" должен иметь по крайней мере один формальный параметр типа класс"
Покажи как ты добавил
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 18:26  [ТС]     Перегрузка оператора + #9
Цитата Сообщение от porshe Посмотреть сообщение
Покажи как ты добавил
C++
1
friend const char* operator+ (const char* str1, const char* str2)
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
02.08.2014, 18:31     Перегрузка оператора + #10
Цитата Сообщение от GetHelp Посмотреть сообщение
const char* operator+ (const char* str1, const char* str2)
а теперь посмотри как определе этот оператор в "классическом" string
http://www.cplusplus.com/reference/s...ing/operator+/
вернуть ты должен объект класса
и хоть один из аргументов должен быть классом
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 18:36     Перегрузка оператора + #11
GetHelp, нельзя в оператор + впихнуть больше 1-го аргумента и объявить свой оператор на большее число аргументов тоже нельзя, этого сделать язык не позволяет
http://codepad.org/WbXX07Nw
http://ideone.com/lm1na4
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 18:40  [ТС]     Перегрузка оператора + #12
Цитата Сообщение от ValeryS Посмотреть сообщение
а теперь посмотри как определе этот оператор в "классическом" string
http://www.cplusplus.com/reference/s...ing/operator+/
если бы я хотел сделать копию классического стринга я бы... нет я бы просто не стал страдать фигней... я пытаюсь сделать более простой вариант строки, основной смысл - максимально добиться функциональности паскалевых строк, т.е. никакой мороки с аллокацией памяти и т.д.
Цитата Сообщение от ValeryS Посмотреть сообщение
вернуть ты должен объект класса
это верно, че то протупил, но ошибка все равно такая же висит...
Цитата Сообщение от ValeryS Посмотреть сообщение
и хоть один из аргументов должен быть классом
а можно хоть как то сделать чтобы складывались именно 2 char*?

Добавлено через 36 секунд
-=ЮрА=-, печаль беда паника
porshe
 Аватар для porshe
52 / 46 / 17
Регистрация: 18.07.2014
Сообщений: 194
02.08.2014, 18:42     Перегрузка оператора + #13
Цитата Сообщение от GetHelp Посмотреть сообщение
а можно хоть как то сделать чтобы складывались именно 2 char*?
никак, язык не позволяет
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 18:45     Перегрузка оператора + #14
GetHelp, объясни зачем классу строка объявлять оператор сложения для совершенно от него не зависящих классов? У тебя ошибка логики проектирования. Приведи хотябы на словах что ты хочешь сделать или покажи.
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 18:48  [ТС]     Перегрузка оператора + #15
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
объясни зачем классу строка объявлять оператор сложения для совершенно от него не зависящих классов? У тебя ошибка логики проектирования. Приведи хотябы на словах что ты хочешь сделать или покажи.
в паскале/делфи просто прокатывает такая конструкция:
Delphi
1
2
3
4
Var str: String;
begin
str := 'hello' + 'world';
end;
а поскольку я пытался реализовать именно паскалевские строки я пытался так тоже сделать, но походу увы тут так нельзя
-=ЮрА=-
Заблокирован
Автор FAQ
02.08.2014, 18:54     Перегрузка оператора + #16
GetHelp, кто мешает сдлеать тебе следующее
C++
1
String val = String(str1) + str2;
Добавь только конструктор преобразования
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,048
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];
}
но как ты собираешься с этим работать?
GetHelp
-8 / 60 / 6
Регистрация: 27.02.2013
Сообщений: 1,112
02.08.2014, 19:02  [ТС]     Перегрузка оператора + #18
-=ЮрА=-, ну похоже так и придется делать...

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

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

Не по теме:

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

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 19:27     Перегрузка оператора +
Еще ссылки по теме:

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

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

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

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