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

Перегрузка оператора [] - C++

Восстановить пароль Регистрация
 
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
12.03.2013, 20:23     Перегрузка оператора [] #1
У меня есть класс Przedzial (Интервал) с приватными переменными double low и double up
И нужно перегрузить оператор [] для случая
ob [n] [m] , где ob - объект класса
m - на сколько кусков делим интервал
n - который из них возвращаем.
Например: ob (4,10)
ob [2][3] = (6,8)

а теперь сама проблема , [] можно перегрузить только для одного аргумента
и я просто ума не приложу как сделать так чтобы функция использовала оба числа сразу.
C++
1
2
3
4
Przedzial Przedzial::operator[] (double lol)
{
    return lol;
}
То есть вот такое работает сначала для [2] , потом для [3]
Как тогда сделать так чтобы использовались оба аргумента?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.03.2013, 20:23     Перегрузка оператора []
Посмотрите здесь:

Перегрузка оператора C++
перегрузка оператора = C++
C++ Перегрузка оператора <<
Перегрузка оператора << C++
C++ Перегрузка оператора + и =
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
12.03.2013, 20:30     Перегрузка оператора [] #2
Цитата Сообщение от Starfalll Посмотреть сообщение
[] можно перегрузить только для одного аргумента
всё верно,
Цитата Сообщение от Starfalll Посмотреть сообщение
ob [2][3] = (6,8)
так сделать не получится, но можно перегрузить оператор (), обычно для таких случаев так и делают, и будет

Цитата Сообщение от Starfalll Посмотреть сообщение
ob (2, 3) = (6,8)
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
12.03.2013, 20:35  [ТС]     Перегрузка оператора [] #3
оператор () уже перегружен , да и на () было бы слишком просто
Кудаив
328 / 405 / 24
Регистрация: 27.05.2012
Сообщений: 1,162
Завершенные тесты: 2
12.03.2013, 20:52     Перегрузка оператора [] #4
Цитата Сообщение от Starfalll Посмотреть сообщение
оператор () уже перегружен
так можно перегружать любой оператор сколь угодно раз, согласно правилам перегрузки есесьна


C++
1
ob [2][3] = (6,8)
а так не получится
HighPredator
 Аватар для HighPredator
5342 / 1725 / 320
Регистрация: 10.12.2010
Сообщений: 5,108
Записей в блоге: 3
12.03.2013, 20:58     Перегрузка оператора [] #5
Тогда вам нужен будет вспомогательный класс.
Цитата Сообщение от Starfalll Посмотреть сообщение
на () было бы слишком просто
А так будет неоправдано сложно, чем просто метод с двумя параметрами сделать. Оно вам надо?

Добавлено через 6 минут
Вот кстати, недавно обсуждалось: Перегрузка двойного индексного оператора
Starfalll
0 / 0 / 0
Регистрация: 09.03.2013
Сообщений: 32
20.03.2013, 22:24  [ТС]     Перегрузка оператора [] #6
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
Przedzial Przedzial::operator[] (double lol)
{
    if (sieg==false)
    {
        n=lol;
        //cout << n << "heil" << endl;
        sieg = true;
        return *this;
    }
    else
    {
        m=lol;
        if (m<=0)
        {
    //      cout << m << " M" << endl;
            sieg = false;
            return *this;
        }
 
        if (n>=1 && n<=m && m>0)
        {
            double fabsodcink;
            fabsodcink = fabs(this->low)+fabs(this->up);
        //  cout << fabsodcink << " fabsodcink" << endl;
            fabsodcink = fabsodcink/m;
        //  cout << fabsodcink << " fabsodcink" << endl;
            this->low=this->low+fabsodcink*(n-1);
            this->up=this->up-fabsodcink*(m-n);
        //  cout << *this << " this" << endl;
            sieg = false;
            return *this;
        }
        else
        {
            sieg =false;
            return *this;
        }
    }
}
Вот если кому понадобится , так решил эту проблему.
Глобальная переменная bool sieg , с помощью которой мы можем считать 2 числа и ими пользоваться.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.03.2013, 22:40     Перегрузка оператора [] #7
это кривое решение. в таких случаях делают через прокси объекты. но там тоже есть свои ньюансы.
выглядит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
Proxy Foo::operator[] (double lol);
//и у Proxy тоже есть свой оператор []
 
//ну и пользовательский код в результате выглядит так:
Foo foo;
foo[1][2] = ...
 
//в вашем случае можно без глобальной переменной обойтись. вместо
return *this;
//делать
Przedzial result(*this);
result.setFlag(true);
return result;
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.03.2013, 14:21     Перегрузка оператора [] #8
Starfalll, решается так:
Interval.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
#ifndef INTERVAL_H
#define INTERVAL_H
 
#include "BrokenInterval.h"
 
class Interval
{
public:
    Interval(double lower_bound, double upper_bound);
 
    double get_lower_bound() const;
    void set_lower_bound(double lower_bound);
 
    double get_upper_bound() const;
    void set_upper_bound(double upper_bound);
 
    BrokenInterval operator[](int parts_count) const;
 
private:
    double m_lower_bound;
    double m_upper_bound;
};
 
#endif  /* INTERVAL_H */
Interval.cpp
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
#include "Interval.h"
#include "BrokenInterval.h"
 
Interval::Interval(double lower_bound, double upper_bound):
    m_lower_bound(lower_bound),
    m_upper_bound(upper_bound)
{
}
 
double Interval::get_lower_bound() const
{
    return m_lower_bound;
}
 
void Interval::set_lower_bound(double lower_bound)
{
    m_lower_bound = lower_bound;
}
 
double Interval::get_upper_bound() const
{
    return m_upper_bound;
}
 
void Interval::set_upper_bound(double upper_bound)
{
    m_upper_bound = upper_bound;
}
 
BrokenInterval Interval::operator[](int parts_count) const
{
    return BrokenInterval(*this, parts_count);
}
BrokenInterval.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef BROKENINTERVAL_H
#define BROKENINTERVAL_H
 
class Interval;
 
class BrokenInterval
{
public:
    BrokenInterval(const Interval& interval, int parts_count);
 
    Interval operator[](int interval_index) const;
 
private:
    const Interval& m_interval;
          int       m_parts_count;
};
 
#endif  /* BROKENINTERVAL_H */
BrokenInterval.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "BrokenInterval.h"
#include "Interval.h"
 
BrokenInterval::BrokenInterval(const Interval& interval, int parts_count):
    m_interval(interval),
    m_parts_count(parts_count)
{
}
 
Interval BrokenInterval::operator[](int interval_index) const
{
    double lower_bound = m_interval.get_lower_bound();
    double upper_bound = m_interval.get_upper_bound();
 
    double interval_length = (upper_bound - lower_bound) / m_parts_count;
 
    double new_lower_bound = lower_bound + (interval_index - 1) * interval_length;
    double new_upper_bound = new_lower_bound + interval_length;
 
    return Interval(new_lower_bound, new_upper_bound);
}
main.cpp
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
#include <iostream>
 
#include "Interval.h"
 
int main()
{
 
    Interval interval(0.0, 10.0);
    Interval new_interval = interval[5][2];
 
    std::cout << "Interval: ("
              << interval.get_lower_bound()
              << ", "
              << interval.get_upper_bound()
              << ")"
              << std::endl;
 
    std::cout << "New interval: ("
              << new_interval.get_lower_bound()
              << ", "
              << new_interval.get_upper_bound()
              << ")"
              << std::endl;
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 15:21     Перегрузка оператора []
Еще ссылки по теме:

Перегрузка оператора + C++
Перегрузка оператора << C++
Перегрузка оператора -> C++

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

Или воспользуйтесь поиском по форуму:
fjay69
 Аватар для fjay69
85 / 85 / 1
Регистрация: 26.10.2012
Сообщений: 248
25.03.2013, 15:21     Перегрузка оператора [] #9
В этой программе объект SampleClass имеет перегруженный оператор[], который возвращает объект lev1SampleClass, чей перегруженный оператор[] возвращает нужный нам элемент. Для примера взят двухмерный массив 2х2.
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
#include <iostream>
#include <cstdlib>
using namespace std;
 
class lev1SampleClass
{
  public:
    lev1SampleClass(int a, int b)
    {
      array[0]=a;
      array[1]=b;
    }
    int &operator[](int x)
    {
      return array[x];
    }
  private:
    int array[2];
};
 
class SampleClass
{
  public:
    SampleClass()
    {
      //Значения по умолчанию (для примера)
      array[0]=new lev1SampleClass(1,2);
      array[1]=new lev1SampleClass(3,4);
    }
    lev1SampleClass &operator[](int x)
    {
      return *array[x];
    }
  private:
    lev1SampleClass* array[2];
};
 
int main()
{
  setlocale(LC_ALL, "RUS");
  SampleClass a;
  cout<<a[1][1];//выводит 4, как и должно быть!
  system("pause");
  return 0;
}
ob [2][3] = (6,8)
В данном случае нужно перегрузить оператор присваивания для lv1SampleClass.
Yandex
Объявления
25.03.2013, 15:21     Перегрузка оператора []
Ответ Создать тему
Опции темы

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