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

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

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

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

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

не получается в своем классе перегрузить оператор + пишет "error C2804: бинарный "operator +" имеет слишком много параметров", действительно задал 2 параметра, но как еще то? ведь + и подразумевает собой сложение 2х значений...
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...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
02.08.2014, 18:07 #2
Цитата Сообщение от GetHelp Посмотреть сообщение
и подразумевает собой сложение 2х значений...
насколько помню одно то из значений текущий объект т.е this
Цитата Сообщение от GetHelp Посмотреть сообщение
действительно задал 2 параметра,
А он считает что 3
хотя могу ошибаться
GetHelp
-7 / 61 / 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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
02.08.2014, 18:16 #4
Цитата Сообщение от GetHelp Посмотреть сообщение
а как же тогда перегрузить чтобы было сложение именно 2х различных значений?
Я же сказал
Цитата Сообщение от ValeryS Посмотреть сообщение
могу ошибаться
давненько не делал
Покажи как перегружаешь?
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
-7 / 61 / 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
52 / 46 / 17
Регистрация: 18.07.2014
Сообщений: 194
02.08.2014, 18:25 #8
Цитата Сообщение от GetHelp Посмотреть сообщение
пытался в свой код добавить, пишет "error C2803: "operator +" должен иметь по крайней мере один формальный параметр типа класс"
Покажи как ты добавил
GetHelp
-7 / 61 / 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
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
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
-7 / 61 / 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
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
-7 / 61 / 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;
а поскольку я пытался реализовать именно паскалевские строки я пытался так тоже сделать, но походу увы тут так нельзя
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 18:48
Привет! Вот еще темы с ответами:

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
02.08.2014, 18:48
Ответ Создать тему
Опции темы

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