powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка оператора.
20 сообщений из 20, страница 1 из 1
Перегрузка оператора.
    #33744537
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно перегрузить оператор умножения. В чем проблема. Прошу заранее извинения если вопрос глупый, я в С++ новичек.

Код: plaintext
1.
2.
3.
Vector& operator* (Vector& y, double x)
{
return y;
}

error C2804: binary 'operator *' has too many parameters
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744565
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgeshkaМне нужно перегрузить оператор умноженияЭто функция-член или friend ?

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744591
Kulta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Бьерна Страуструпа это хорошо расписано.
http://lib.ru/CPPHB/cpptut.txt
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744670
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас
EvgeshkaМне нужно перегрузить оператор умноженияЭто функция-член или friend ?

Posted via ActualForum NNTP Server 1.3

На данный момент времени она объявлена как функция - член наверное.
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744679
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgeshkaНа данный момент времени она объявлена как функция - членТогда первым операндом будет this

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744682
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перегружать * нужно с одним параметром, второй передаётся неявно через this - указатель на объект класса, использующий данную операцию...
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744722
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitrii K.второй передаётся неявно через thisПо-моему, не второй, а первый

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744751
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас
Dmitrii K.второй передаётся неявно через thisПо-моему, не второй, а первый

Posted via ActualForum NNTP Server 1.3
Я количество имел ввиду, а не порядок... да и какая, в принципе, разница...
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33744853
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitrii K.Я количество имел ввидуНу тогда совсем другое дело ! тем более, что ссылка на доку уже была дана

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33745419
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо братцы, у меня все получилось.
Тут другая проблема вылезла, не могу теперь перегрузить оператор +:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int* operator= (int* _Array)
{
for(int i= 0  ;i<Count; ++i) 
	   m_iArr[i] = _Array[i];
 return m_iArr;
}

int* operator+ (int* _Array)
{
	int* Result = new int[Count];
	for(int i= 0  ;i<Count; ++i) 
	   Result[i] = m_iArr[i]+_Array[i];
   return Result;

...
Vector V( 10 ,  20 ,  5 );
Vector M( 10 ,  20 ,  15 );
Vector R( 10 ,  20 ,  0 );
R = M+V;
}

error C2679: binary '+' : no operator found which takes a right-hand operand of type 'Vector' (or there is no acceptable conversion)

В принципе я понимаю что ему не нравится, но например просто оператор присваивания без сложения тут прекрасно работатет. Чего я тут набокопорил?
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33745485
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А оператор Vertor+Vector где ?

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747224
pirovindos
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неплохо бы в операторах +, * и подобных проверять хотя бы совпадение длин векторов.
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747273
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему решил так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int* operator+ (Vector& _Array)
{
	if ((_Array.First!=First)||(_Array.Last!=Last))
	{	
		std::cout << "ERROR: attempt of addition of vectors with different borders of indexes\n";
		return m_iArr;
	}
	int* Result = new int[Count];
	for(int i= 0  ;i<Count; ++i) 
	   Result[i] = m_iArr[i]+_Array.m_iArr[i];
   return Result;
}

Только у меня вопрос по поводу переменной Result, ее сборщик мусора очистит после выполнения оператора + или нет? Мне непонятно где ставить delete[] Result.
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747444
--null--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните мне дураку - разве оператор + должен указатель возвращать?
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747488
Dmitrii K.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--null--разве оператор + должен указатель возвращать?
Не должен, но может...
Используется это для того, чтобы можно было выстраивать "цепочки" из перегруженных операций...
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747501
onstat-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvgeshkaПроблему решил так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
int* operator+ (Vector& _Array)
{
	if ((_Array.First!=First)||(_Array.Last!=Last))
	{	
		std::cout << "ERROR: attempt of addition of vectors with different borders of indexes\n";
		return m_iArr;
	}
	int* Result = new int[Count];
	for(int i= 0  ;i<Count; ++i) 
	   Result[i] = m_iArr[i]+_Array.m_iArr[i];
   return Result;
}

Только у меня вопрос по поводу переменной Result, ее сборщик мусора очистит после выполнения оператора + или нет? Мне непонятно где ставить delete[] Result.

Никто ее не очистит,
переменная будет потеряна при выходе из функции,
а освобождать нужно будет память по указателю,
который возвращается из функции, иначе будет memory leak.
И освобождать нужно ЯВНО.

Это плохая идея через некоторое время, когда проект пойдет дальше ,
ты долго будешь искать где же память протекает.

1. Если это функция член, этот указатель нужно обьявлять
полем класса и освобождать память в деструкторе.

2. Каждый вызов оператора должен проверять была ли
ранне выделена память.
Иначе каждый вызов будет брать себе новую память а старая
будет потеряна(memory leak), а деструктор освободит память выделенную
только последним вызовом оператора.
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747651
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему решил так:
1. переменную обьявил как:
Код: plaintext
1.
2.
3.
4.
class Vector
{
private:
  int* m_iArr;
  int* Result;
1. new делаю только один раз в конструкторе класса.
2. delete также один раз в деструкторе класса.

Так вроде все работает.
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747666
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class Vector
{
  Vector operator* (const double x)
  {
   return *this;
  }
...
};
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33747690
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хочешь сделать это нормально,

int* operator= (int* _Array)
int* operator+ (int* _Array)

должны возвращать:
operator= - ссылку на объект ( Vector& )
operator+ - экземпляр объекта ( Vector )
...
Рейтинг: 0 / 0
Перегрузка оператора.
    #33748025
Фотография Evgeshka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕсли хочешь сделать это нормально,

int* operator= (int* _Array)
int* operator+ (int* _Array)

должны возвращать:
operator= - ссылку на объект ( Vector& )
operator+ - экземпляр объекта ( Vector )

Спасибо, я на будущее я это учту.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Перегрузка оператора.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]