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

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

Войти
Регистрация
Восстановить пароль
 
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
#1

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

13.04.2013, 23:49. Просмотров 690. Ответов 10
Метки нет (Все метки)

Доброго дня суток. Хочу перегрузить оператор умножение числа на матрицу.
Перегрузил сначала в классе вот так:
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 ругается,что нету оператора "*" для таких типов.
Что я не так сделал?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2013, 23:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка оператора умножения числа на матрицу (C++):

Перегрузка оператора умножения - C++
Доброго времени суток, прошу помощи с перегрузкой оператора *. Есть задача, где необходимо создать шаблон класса, в котором можно...

Перегрузка оператора умножения - C++
Здравствуйте. Пишу реализацию действий с матрицами. Возникла проблема. Вот перегрузка умножения для матрицы на число: Matrix...

Перегрузка оператора умножения вектора на число - C++
Помогите пожалуйста сделать перегрузку, вектор на число умножить, точнее что бы оба вектора умножались на одно число, сам не могу сделать,...

Перегрузка оператора умножения для матрицы - C++
Помогите пожалуйста, не получается перегрузить умножение матриц как произведение элемента на элемент матриц. Класс создавался для работы...

Перегрузка оператора* для умножения матрицы на число - C++
Имеем перегрузку оператора для умножения матрицы на число. Matrix operator* (int p) { Matrix res(n,m); res.reset(); for...

Перегрузка оператора умножения в шаблоне класса вектора (Visual Studio 2013) - C++
Здравствуйте! Пишу шаблон класса векторов и хочу реализовать в нем перегрузку оператора умножения на число. Сложение, вычитание,...

10
abit
271 / 270 / 34
Регистрация: 03.02.2013
Сообщений: 754
13.04.2013, 23:59 #2
ну если это вне класса описывается, то как минимум надо

C++
1
matrix::matrix operator* (const double & arg_double, const matrix& args)
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.04.2013, 00:02  [ТС] #3
abit, этот весь код из хидера. зачем еще указывать из какого файла оператор?
0
abit
271 / 270 / 34
Регистрация: 03.02.2013
Сообщений: 754
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()
{...};
о чём идет речь


я тебе больше скажу - прежде чем компилировать программу семейство языков Си вообще все файлы в один большой собирает (это недостаток)
0
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.04.2013, 00:12  [ТС] #5
написал так. теперь оно,кроме как на "*" ругается, так еще и на запись matrix::matrix...
0
abit
271 / 270 / 34
Регистрация: 03.02.2013
Сообщений: 754
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;
}
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 скинуть. надо?
0
abit
271 / 270 / 34
Регистрация: 03.02.2013
Сообщений: 754
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));
что это вообще такое?
1
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
14.04.2013, 00:53  [ТС] #9
abit, я понял. спасибо!

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

означает - если переменная mag меньше этого мизерного числа, то не продолжать эту итерацию цикла, а сразу перейти к следующей
1
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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)
0
14.04.2013, 09:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.04.2013, 09:58
Привет! Вот еще темы с ответами:

Перегрузка оператора, комплексные числа - C++
Не могу понять что делаю не так, компилятор выдает ошибки. Но все они из за неправельной перегрузки операторов вывода &lt;&lt; и &gt;&gt; . ...

Классы, комплексные числа и перегрузка оператора - C++
Составить описание класса для представления комплексных чисел. Обеспечить вы- полнение операций сложения, вычитания и умножения...

Избыточное копирование объекта при реализации оператора умножения и оператора присваивания - C++
Есть класс работы с матрицами. Есть операция умножения матриц, описанная как оператор класса. В данном коротком примере я просто моделирую...

Прегерузка оператора умножения. - C++
Есть код, нужно дописать перегрузку умножения. В консоле должни выводится числа 1, 3, 6...27. Помогите плз. #include &lt;iostream&gt; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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