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

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

Войти
Регистрация
Восстановить пароль
 
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
#1

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

06.06.2013, 00:52. Просмотров 522. Ответов 14
Метки нет (Все метки)

Здарвствуйте, помогите с задачей:
Имеется класс, создающий двумерный массив, в этом классе нужно реальзовать метод перегружающий () для того, что бы можно было доставать элемент из массива по его индексу [строка][столбец]
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#ifndef _MATRIX_H_
#define _MATRIX_H_
#include <iostream>
#include<Windows.h>
#include<time.h>
using namespace std;
 
class Matrix
{
    int **A, m, n;
public:
    Matrix(){};
    Matrix(int l, int f);
    Matrix(const Matrix &ob);//конструктор копирования
    ~Matrix();
    void show();
    void function(int m1,int n1);
    Matrix& operator() (int m, int n)//перегрузка операции ()
    {
        this->m=m;
        this->n=n;
        return *this;
    }
    friend istream& operator>>(istream& is, Matrix &mat)
    {
        int m1, n1;
        cout<<"Введите индекс элемента:\n";
        is>>m1>>n1;
        return is;
    }
    friend ostream& operator<<(ostream& os, Matrix &mat)
    {
        int m1, n1;
        cout<<"Искомый элемент:\t";
        os<<mat.A[mat.m][mat.n]<<endl;
        return os;
    }
};
 
Matrix::Matrix(int l, int f)
{
    function(l,f);
}
Matrix::Matrix(const Matrix &ob)
{
    function(ob.m,ob.n);
    for(int i=0;i<ob.m;i++)
    {
        for(int j=0;j<ob.n;j++)
        {
            A[i][j]=ob.A[i][j];
        }
    }
}
Matrix::~Matrix()
{
    for(int i=0;i<m;i++)
    {
        delete []A[i];
    }
    delete []A;
}
void Matrix::show()
{
    int k=0;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            k++;
            A[i][j]=rand() % 101 - 50;
            cout<<A[i][j]<<' ';
        }
        cout<<endl;
    }
}
void Matrix::function(int m1,int n1)
{
    A=new int*[m1];
    for(int i=0;i<m1;i++)
    {
        for(int j=0;j<n1;j++)
        {
            A[i]=new int[n1];
        }
    }
    m=m1;
    n=n1;
}
#endif
метод перегрузки () вроде бы правельный, но появилась проблема с перегрузкой << т.е. непосредственно вывод искомого элемента
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2013, 00:52     Перегрузка ()
Посмотрите здесь:

C++ Перегрузка new
C++ C++ Перегрузка
C++ Перегрузка
C++ перегрузка
C++ Перегрузка << и >>
Перегрузка в c++ C++
C++ Перегрузка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
06.06.2013, 01:03     Перегрузка () #2
Цитата Сообщение от LiV Посмотреть сообщение
в этом классе нужно реальзовать метод перегружающий () для того, что бы можно было доставать элемент из массива по его индексу [строка][столбец]
Цитата Сообщение от LiV Посмотреть сообщение
C++
1
2
3
4
5
6
Matrix& operator() (int m, int n)//перегрузка операции ()
* * {
* * * * this->m=m;
* * * * this->n=n;
* * * * return *this;
* * }
Это как вообще между собой соотносится?)

Добавлено через 51 секунду
Цитата Сообщение от LiV Посмотреть сообщение
метод перегрузки () вроде бы правельный
Нет.
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,040
06.06.2013, 01:04     Перегрузка () #3
Я просто положу это сюда.
Matrix.h
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#ifndef _MATRIX_H_
#define _MATRIX_H_
#include <iostream>
#include <vector>
#include <cstddef>
#include <stdexcept>
 
 
template <typename T>
class Matrix
{
    public:
        // синонимы
        typedef std::vector<T> vec_T;
        typedef typename vec_T::iterator vec_T_it;
        typedef typename vec_T::const_iterator vec_T_cit;
        typedef std::vector< vec_T > vec_v;
        typedef typename vec_v::iterator vec_v_it;
        typedef typename vec_v::const_iterator vec_v_cit;
 
        // конструкторы
        Matrix();
        Matrix(const size_t);
 
        // set-методы
        void setSize(const size_t);
        void setMatrix(const vec_v &);
 
        // get-методы
        size_t getSize() const;
        const vec_v& getMatrix() const;
 
        // опреаторы обращения
        T operator() (size_t index1, size_t index2);
        const T operator() (size_t index1, size_t index2) const;
 
        template <typename U>
        friend std::ostream & operator<< (std::ostream &, const Matrix<U> &);
        template <typename U>
        friend std::istream & operator>> (std::istream &, Matrix<U> &);
 
    private:
        vec_v matr; // матрица
        size_t N;   // размер
};
 
template <typename T>
Matrix<T>::Matrix() : matr(), N(0)
{}
 
template <typename T>
Matrix<T>::Matrix(const size_t size) : matr(size), N(size)
{}
 
template <typename T>
void Matrix<T>::setSize(const size_t size)
{
    N = size;
}
 
template <typename T>
void Matrix<T>::setMatrix(const vec_v& v)
{
    matr = v;
}
 
template <typename T>
size_t Matrix<T>::getSize() const
{
    return N;
}
 
template <typename T>
const std::vector<std::vector<T> >& Matrix<T>::getMatrix() const
{
    return matr;
}
 
template <typename T>
T Matrix<T>::operator() (size_t index1, size_t index2)
{
    if (index1 >= N || index2 >= N)
        throw std::out_of_range("Matrix subscript out of range");
    return matr[index1][index2];
}
 
template <typename T>
const T Matrix<T>::operator() (size_t index1, size_t index2) const
{
    if (index1 >= N || index2 >= N)
        throw std::out_of_range("Matrix subscript out of range");
    return matr[index1][index2];
}
 
 
// перегружаем оператор вывода, функция принимает в качестве параметров ссылку
// на ostream и константную ссылку на объект Matrix
template <typename T>
std::ostream & operator<< (std::ostream &out, const Matrix<T>& m)
{
    typedef std::vector<T> vec_T;
    typedef typename vec_T::const_iterator vec_T_cit;
    typedef std::vector< vec_T > vec_v;
    typedef typename vec_v::const_iterator vec_v_cit;
 
    for (vec_v_cit cit = m.matr.begin();
        cit != m.matr.begin() + m.N && cit != m.matr.end(); ++cit)
    {
        for (vec_T_cit cit2 = cit->begin();
            cit2 != cit->begin() + m.N && cit2 != cit->end(); ++cit2)
        {
            std::cout << *cit2 << ' ';
        }
        std::cout << std::endl;
    }
    return out; // возвращаем сформированный поток
}
 
// перегружаем оператор вывода, функция принимает в качестве параметров ссылку
// на istream и ссылку на объект Matrix
template <typename T>
std::istream & operator>> (std::istream &ist, Matrix<T>& m)
{
    if (m.N != 0)
    {
        typedef std::vector<T> vec_T;
 
        m.matr.clear();
        for (size_t i=0; i < m.N; i++)
        {
            vec_T vi; // строка матрицы
            T tmp;    // временная переменная
            for (size_t j=0; j < m.N && ist >> tmp; j++)
                vi.push_back(tmp);
            if (vi.size() != m.N)
                throw std::range_error("Bad size given");
 
            m.matr.push_back(vi); // добавляем строку в вектор
        }
 
        if (m.matr.size() != m.N)
            throw std::range_error("Bad size given");
    }
 
    return ist;
}
 
#endif
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
06.06.2013, 01:21  [ТС]     Перегрузка () #4
Цитата Сообщение от gray_fox Посмотреть сообщение
Matrix& operator() (int m, int n)//перегрузка операции ()
* * {
* * * * this->m=m;
* * * * this->n=n;
* * * * return *this;
* * }
в качестве аргументов у меня сдесь строка и столбец, через которые я буду доставать элемент, я их приравниваю к строке и столбцу в private через указатель, за тем что бы вернуть из метода ссылку возвращающую этот метод, в return я ставлю *this, ведь так же оно должно быть?..
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,040
06.06.2013, 01:25     Перегрузка () #5
LiV, посмотрите как реализовано у меня. В том то и дело (), что возвращает он по значению, а не по ссылке, но [] ограничен одним индексом, это конечно обходят собственными костылями, но профит с получением по ссылке, как в случае с [] по сравнению с обычным обращением должен быть весьма и весьма.
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
06.06.2013, 01:25     Перегрузка () #6
Цитата Сообщение от LiV Посмотреть сообщение
в качестве аргументов у меня сдесь строка и столбец, через которые я буду доставать элемент, я их приравниваю к строке и столбцу в private через указатель, за тем что бы вернуть из метода ссылку возвращающую этот метод, в return я ставлю *this, ведь так же оно должно быть?..
Не, аргументы правильные, да, но откуда эти действия с приравниями и пр.; зачем возвращать ссылку на объект матрицы, если нужно получить (ссылку на) элемент?
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
06.06.2013, 01:26  [ТС]     Перегрузка () #7
Реализация толковая, но хотелось бы меньше кода, и все таки без применения шаблонов и векторов
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,040
06.06.2013, 01:28     Перегрузка () #8
LiV, в чем проблема посмотреть как это делается и переписать под себя?
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
06.06.2013, 01:29     Перегрузка () #9
LiV, примерно
C++
1
2
3
4
5
6
7
int & operator ()(std::size_t const i, std::size_t const j) {
   return A[i][j];
}
 
int operator ()(std::size_t const i, std::size_t const j) const {
   return A[i][j];
}
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,040
06.06.2013, 01:31     Перегрузка () #10
gray_fox, а я думаю, что так:
C++
1
2
3
4
5
6
7
int operator ()(const std::size_t i, const std::size_t j) {
   return A[i][j];
}
 
const int operator ()(const std::size_t i, const std::size_t j) const {
   return A[i][j];
}
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
06.06.2013, 01:34     Перегрузка () #11
MrGluck, т.е. я не смогу писать такие штуки:
C++
1
2
3
void set(Matrix & matrix, std::size_t const i, std::size_t const j, int const value) {
   matrix(i, j) = value;
}
?

Добавлено через 54 секунды
MrGluck, да и если так, тогда первый метод не нужен.
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,040
06.06.2013, 01:38     Перегрузка () #12
Да, твой способ кошернее.

Цитата Сообщение от gray_fox Посмотреть сообщение
MrGluck, да и если так, тогда первый метод не нужен.
Для получения const-переменных, возвращаемых оператором, для того и перегрузка по const на this.
Также делают и в контейнерах STL
(у stack, например)
C++
1
2
value_type& top ( );
const value_type& top ( ) const;
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
06.06.2013, 01:39  [ТС]     Перегрузка () #13
Черт я вот так и не понял, для чего реальзовывать константный оператор()?
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,040
06.06.2013, 01:40     Перегрузка () #14
LiV, для перегрузки т.к. нельзя перегрузить функцию по возвращаемому значению, а вот с добавлением const на this можно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2013, 01:41     Перегрузка ()
Еще ссылки по теме:

C++ перегрузка []
C++ перегрузка >> и <<
перегрузка C++
C++ Перегрузка
C++ Перегрузка ++ и --

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
1256 / 1139 / 55
Регистрация: 21.04.2012
Сообщений: 2,361
Завершенные тесты: 3
06.06.2013, 01:41     Перегрузка () #15
Цитата Сообщение от MrGluck Посмотреть сообщение
Для получения const-переменных, возвращаемых оператором, для того и перегрузка по const на this.
Также делают и в контейнерах STL
(у stack, например)
Код C++
1
2
value_type& top ( );
const value_type& top ( ) const;
Если возвращать по значению, а не по ссылке, то смысла в не-конст методе нет.
Yandex
Объявления
06.06.2013, 01:41     Перегрузка ()
Ответ Создать тему
Опции темы

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