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

Перегрузка оператора умножения числа на матрицу - C++

Восстановить пароль Регистрация
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
13.04.2013, 23:49     Перегрузка оператора умножения числа на матрицу #1
Доброго дня суток. Хочу перегрузить оператор умножение числа на матрицу.
Перегрузил сначала в классе вот так:
C++
1
matrix  operator*(const double  );
а вне класса(в том же хидере) написал вот так:
C++
1
2
3
4
matrix operator*(const double & arg_double, const matrix & arg_matrix)
{
    return ((arg_matrix)*(arg_double));
}
VS ругается,что нету оператора "*" для таких типов.
Что я не так сделал?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
13.04.2013, 23:59     Перегрузка оператора умножения числа на матрицу #2
ну если это вне класса описывается, то как минимум надо

C++
1
matrix::matrix operator* (const double & arg_double, const matrix& args)
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.04.2013, 00:02  [ТС]     Перегрузка оператора умножения числа на матрицу #3
abit, этот весь код из хидера. зачем еще указывать из какого файла оператор?
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
14.04.2013, 00:08     Перегрузка оператора умножения числа на матрицу #4
Цитата Сообщение от metaluga145 Посмотреть сообщение
abit, этот весь код из хидера. зачем еще указывать из какого файла оператор?
это не указание файла, а указание области видимости

если есть допустим
C++
1
2
3
class A
{ void method();
};
то даже если ты пишешь в том же хидере но вне класса, надо указывать область видимости:

C++
1
2
3
4
5
6
7
8
class A
{ void method();
};
 
void A::method()
{
....
}
не указывать можно только если ты реализацию напрямую в класс пихаешь

C++
1
2
3
class A
{ void method() {...};
};
иначе как он поймёт в таком случае
C++
1
2
3
4
5
6
7
8
9
class A
{ void method();
};
class B
{ void method();
};
 
void method()
{...};
о чём идет речь


я тебе больше скажу - прежде чем компилировать программу семейство языков Си вообще все файлы в один большой собирает (это недостаток)
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.04.2013, 00:12  [ТС]     Перегрузка оператора умножения числа на матрицу #5
написал так. теперь оно,кроме как на "*" ругается, так еще и на запись matrix::matrix...
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
14.04.2013, 00:15     Перегрузка оператора умножения числа на матрицу #6
дайте побольше кода, так сложно сказать

вот в таком виде это компилируется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
class matrix
{
      public:
      matrix(){};
      ~matrix(){};
      matrix operator*(const double);
};
 
matrix::matrix operator* (const double & arg_double, const matrix& args)
{
    return (args);
}
 
 
int main()
{
    return 0;
}
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.04.2013, 00:21  [ТС]     Перегрузка оператора умножения числа на матрицу #7
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
#pragma once
class matrix
{
public:
    matrix(const int , const int );//конструктор, создает еденичную матрицу
    matrix(const int , const int , const double* );//конструктор, берет значения из массива
    matrix::matrix(matrix &copy);//конструктор копирования
    ~matrix();//деструктор
 
    double *array;//массив матрицы
    int rows, columns;//количество столбцов и строк
 
    matrix& set(const double* );//функция изминения значения всех элементов матрицы
    matrix& eye();//делает матрицу еденичной(возможно не квадратной)
    matrix& zero();//делает матрицу нулевой
    matrix transpose();//функция траспонирования, возвращает матрицу
    matrix  operator*(const matrix& );//оператор умножения матриц
    matrix  operator*(const double  );//оператор умножение на дабл
    matrix  operator+(const matrix& );//оператор сложения матриц
    matrix  operator-(const matrix& );//оператор вычитания матриц
    matrix& operator=(const matrix& );//оператор присваивания
    void householderDecomposition(matrix& , matrix& );//алгоритм Хаусхолдера, изменяет параметры-ссылки
    void output();//вывод матрицы
};
 
matrix::matrix operator*(const double & arg_double, const matrix & arg_matrix)
{
    return ((arg_matrix)*(arg_double));
}
Добавлено через 4 минуты
Могу еще .cpp скинуть. надо?
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
14.04.2013, 00:37     Перегрузка оператора умножения числа на матрицу #8
что-то вы только затуманили картину )))

я так понимаю этот оператор должен умножать double число на матрицу и возвращать новую матрицу (т.к. arg_matrix у вас const) для этого вам надо таки создать эту самую новую матрицу, внести в неё все элементы из старой

во первых где конструктор по умолчанию... ну допустим превратим в него один из двух конструкторов выше
и создадим через первый конструктор матрицу

C++
1
2
3
4
matrix::matrix operator*(const double & arg_double, const matrix & arg_matrix)
{
    matrix a(arg_matrix.rows,arg_matrix.columns);
...
далее там пройти циклом эту матрицу a и каждый её элемент перемножить на arg_double

и потом
C++
1
2
    return a;
}
по этому return вызовется конструктор копирования, который у вас
C++
1
matrix::matrix(matrix &copy);//конструктор копирования
перенесёт эту матрицу в вызвавшую программу, т.e. для примера

C++
1
2
3
4
void main()
{
   matrix a,b,c;
   c = a*b;
в матрицу c
и следом автоматом вызовется деструктор для matrix a, т.к. автоперменная перестала существовать

логика тут такая по идее должна быть...

а у вас что?
C++
1
return ((arg_matrix)*(arg_double));
что это вообще такое?
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.04.2013, 00:53  [ТС]     Перегрузка оператора умножения числа на матрицу #9
abit, я понял. спасибо!

Добавлено через 2 минуты
abit, и ответьте, пожалуйста, на еще один вопрос, если не сложно. Что означает запись
C++
1
if (mag < 0.0000000001) continue;
??
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
14.04.2013, 00:58     Перегрузка оператора умножения числа на матрицу #10
очевидно это из контекста какого-то цикла

означает - если переменная mag меньше этого мизерного числа, то не продолжать эту итерацию цикла, а сразу перейти к следующей
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 09:58     Перегрузка оператора умножения числа на матрицу
Еще ссылки по теме:

Перегрузка оператора умножения для матрицы C++
C++ Избыточное копирование объекта при реализации оператора умножения и оператора присваивания
Перегрузка оператора умножения C++

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

Или воспользуйтесь поиском по форуму:
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.04.2013, 09:58     Перегрузка оператора умножения числа на матрицу #11
Цитата Сообщение от abit Посмотреть сообщение
ну если это вне класса описывается, то как минимум надо

C++
1
matrix::matrix operator* (const double & arg_double, const matrix& args)
Двоеточия не туда впихнули, хотя бы уж так:
C++
1
matrix matrix::operator* (const double & arg_double, const matrix& args)
Yandex
Объявления
14.04.2013, 09:58     Перегрузка оператора умножения числа на матрицу
Ответ Создать тему
Опции темы

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