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

Методы класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 47, средняя оценка - 4.70
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
30.10.2009, 00:07     Методы класса #1
Я щас организую разреженную матрицу через двусвязный упорядоченый циклический список... ну да не суть.

У меня такой вопрос - я сейчас делаю для класса различные методы, хочу сделать перемножение матриц. В любом случае, для этого понадобятся 2 исходные матрицы и 1 выходная. Выходную я буду создавать внутри метода и возвращать из него ссылку на нее. Проблема с исходными стала такой - очень глупо (как мне кажется) передавать в метод одну матрицу указателем через параметры, а другую как this. Как можно сделать так, чтобы в метод не передавался объект класса напрямую? т.е. чтобы я мог писать не так:
C++
1
2
3
4
matrix *a, *b, *c;
a = new matrix(...);
b = new matrix(...);
c = a->Multiply(b);
а так:
C++
1
2
3
4
matrix *a, *b, *c;
a = new matrix(...);
b = new matrix(...);
c = Multiply(a, b);
Или тогда придется просто создавать ф-ию вне класса? Просто есть языки, где такие методы возможны, в моем учебнике по Си я такого не увидел.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.10.2009, 00:07     Методы класса
Посмотрите здесь:

Виртуальные методы класса C++
C++ протестировать методы класса
C++ методы класса
Массив указателей на методы класса C++
C++ Методы и конструкторы класса
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
snake32
 Аватар для snake32
1305 / 948 / 119
Регистрация: 26.02.2009
Сообщений: 3,489
Записей в блоге: 5
30.10.2009, 00:19     Методы класса #2
Может ещё проще сделать перегрузку оператора *
тогда сможешь написать и так
C++
1
с = a*b
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
30.10.2009, 00:31  [ТС]     Методы класса #3
Понимаешь, это лабораторка по ООП и в данной (4й) нужно сделать ф-ии, позволяющие оперировать с матрицей, и только в следующей (5й) нужно перегружать операторы. Сдавать одну раньше другой нельзя. Уже спрашивал :-(
Неумейка
 Аватар для Неумейка
12 / 11 / 2
Регистрация: 14.02.2009
Сообщений: 89
30.10.2009, 00:34     Методы класса #4
Как вариант: создай еще класс специально для выполнения операций над матрицами ( к примеру MatrixOperations) и добавь туда static функцию Multiply для выполнения твоих операций.
C++
1
MatrixOperations::Multiply(a, b);
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
30.10.2009, 00:41  [ТС]     Методы класса #5
хммм... а смысл создавать класс, для которого я не делаю объектов? Наверно, тогда уж проще добавить просто функций вне всяких классов в .h где у меня класс matrix описан.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
30.10.2009, 00:46     Методы класса #6
создай namespace.
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
30.10.2009, 00:56  [ТС]     Методы класса #7
Посмотрел, что такое namespace, понял, зачем он нужен. Но как и зачем его здесь использовать?
Неумейка
 Аватар для Неумейка
12 / 11 / 2
Регистрация: 14.02.2009
Сообщений: 89
30.10.2009, 01:07     Методы класса #8
Цитата Сообщение от JamesBlack Посмотреть сообщение
а смысл создавать класс, для которого я не делаю объектов?
Да, это я погорячился, лишний класс не нужен . Добавь тогда статик метод в свой класс matrix. Это по-моему самый изящный вариант.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
30.10.2009, 01:30     Методы класса #9
Тебе, насколько я понял, надо вынести Multiply за пределы класса. У тебя есть класс и отдельная функция для работы с данным классом. Так почему бы не сгруппировать это всё определив класс и функцию в своё пространстве имён(можно назвать к примеру Matrix)?
C++
1
2
3
4
Matrix::matrix *a, *b, *c;
a = new Matrix::matrix(...);
b = new Matrix::matrix(...);
c = Matrix::Multiply(a, b);
HIMen
 Аватар для HIMen
4105 / 1354 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
30.10.2009, 01:41     Методы класса #10
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
#include <iostream>
using namespace std;
class Myclass
{
    int i;
public:
    Myclass()
    {
        i=0;
    }
    Myclass(int k)
    {
        i=k;
    }
    static Myclass Plus(Myclass& a, Myclass& b)
    {
        Myclass temp;
        temp.i=a.i+b.i;
        return temp;
    }
    void Print()
    {
        cout << i;
    }
    Myclass& operator = (Myclass obj)
    {
        i=obj.i;
        return *this;
    }
};
int main()
{
    Myclass a(1);
    Myclass b(2);
 
    Myclass c;
    c = Myclass::Plus(a,b);
    c.Print();
    return 0;
}
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
30.10.2009, 02:31  [ТС]     Методы класса #11
Вот! За static спасибо, именно это я и искал!
P.S. за остальную информацию тоже благодарю, хоть здесь и не нужна, потом пригодится.
Lupus
 Аватар для Lupus
22 / 22 / 1
Регистрация: 13.03.2011
Сообщений: 319
26.11.2011, 16:15     Методы класса #12
Подниму темку
А можно как-то вызвать метод, определенный внутри класса, не записывая имя класса перед ним
C++
1
2
3
4
Myclass c;
        c = Myclass::Plus(a,b);
        c.Print();
        return 0;
то есть просто вызвать Plus(a,b).
Или для этого всё-таки придется вытащить опеределение метода из класса?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.11.2011, 16:44     Методы класса
Еще ссылки по теме:

C++ Полиморфизм и шаблонные методы класса
C++ Статические методы класса (static)
C++ Методы класса внутри определения класса

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

Или воспользуйтесь поиском по форуму:
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
26.11.2011, 16:44     Методы класса #13
Цитата Сообщение от Lupus Посмотреть сообщение
А можно как-то вызвать метод, определенный внутри класса, не записывая имя класса перед ним
Нельзя.
Цитата Сообщение от Lupus Посмотреть сообщение
Или для этого всё-таки придется вытащить опеределение метода из класса?
Да, и если нужен доступ к закрытым данным класса, сделать её дружественной(friend) по отношение к MyClass.
P.S. Более правильное решение: избавиться от метода Plus, и перегрузить оператор сложения(operator+).
Yandex
Объявления
26.11.2011, 16:44     Методы класса
Ответ Создать тему
Опции темы

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