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

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

Восстановить пароль Регистрация
 
Sambady
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 6
01.12.2011, 15:27     Перегрузка оператора () #1
Привет всем
помогите придумать способ реализаци следущей задачи:

есть класс симметричная матрица:

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
class Matrix
{
    public:
        Matrix(unsigned int SizeOfMatrix);
        virtual ~Matrix();
       /.../
        int* operator() (unsigned int i, unsigned int j);
 
    private:
        unsigned int size;
        int **PtrToMatrix;
};
 
Matrix::Matrix(unsigned int SizeOfMatrix)
{
    int i,j;
    size=SizeOfMatrix;
    PtrToMatrix = new int *[size];
    for(i=0;i<size;i++)
    {
        PtrToMatrix[i]=new int[size-i];
        for(j=0;j<(size-i);j++)
        {
            PtrToMatrix[i][j]=size-i-j;
        }
    }
}
 
int Matrix::operator() (unsigned int i, unsigned int j)
{
    if( (i>=size) || (j>=size) ) return NULL;
    if(j<=i) return PtrToMatrix[j][i-j];
    else return PtrToMatrix[i][j-i];
}
требуется реализовать чтобы с элементами матрицы можно было работать только! следущим образом

C++
1
2
3
Matrix a(5);
a(2, 0) = 10;
cout << a(2,5)
вариант

C++
1
2
3
4
5
6
7
int* Matrix::operator() (unsigned int i, unsigned int j)
{
    if( (i>=size) || (j>=size) ) return NULL;
    if(j<=i) return &PtrToMatrix[j][i-j];
    else return &PtrToMatrix[i][j-i];
}
*a(2,0)=10;
не устраивает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.12.2011, 15:27     Перегрузка оператора ()
Посмотрите здесь:

C++ Перегрузка оператора ==
Перегрузка оператора C++
C++ Перегрузка оператора =
C++ Перегрузка оператора []
C++ Перегрузка оператора =
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
01.12.2011, 15:35     Перегрузка оператора () #2
Реализуй две член-функции:
C++
1
2
int    Matrix::operator() (unsigned int i, unsigned int j) const;
int&   Matrix::operator() (unsigned int i, unsigned int j);
первая - для чтения элемента, вторая - для записи.

PS: чем operator[] не устраивает?
Сыроежка
Заблокирован
01.12.2011, 15:54     Перегрузка оператора () #3
Sambady,

C++
1
2
3
4
5
6
7
8
9
10
11
int & Matrix::operator () ( unsigned int i, unsigned int j ) throw( std::out_of_range )
{
   if ( ! ( i < size  && j < size ) ) throw ( std::out_of_range( "Matrix::operator ()" ) );
   return ( PtrToMatrix[i][j] );
}
 
const int & Matrix::operator () ( unsigned int i, unsigned int j ) const throw( std::out_of_range )
{
   if ( ! ( i < size  && j < size ) ) throw ( std::out_of_range( "Matrix::operator ()" )  );
   return ( PtrToMatrix[i][j] );
}
CheshireCat
Эксперт С++
2907 / 1235 / 78
Регистрация: 27.05.2008
Сообщений: 3,307
01.12.2011, 16:04     Перегрузка оператора () #4
Именно так, только с уточнением: зачем возвращать ссылку на const int ? Не проще ли просто возвратить этот самый int ?
Сыроежка
Заблокирован
01.12.2011, 16:08     Перегрузка оператора () #5
Цитата Сообщение от CheshireCat Посмотреть сообщение
Именно так, только с уточнением: зачем возвращать ссылку на const int ? Не проще ли просто возвратить этот самый int ?
Вы тем самым позволяете сделать класс шаблонным, где будет достаточно тип int заменить на шаблонный параметр.
Sambady
0 / 0 / 0
Регистрация: 01.12.2011
Сообщений: 6
01.12.2011, 16:21  [ТС]     Перегрузка оператора () #6
спасибо большое
всё работает
Yandex
Объявления
01.12.2011, 16:21     Перегрузка оператора ()
Ответ Создать тему
Опции темы

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