Mam zdefiniowaną klasę, która opisuje przedział. Zrobiłem to w następujący sposób:
class Przedzial {
private:
double low, up; // low - dolna granica, up - górna granica
public:
//tutaj konstruktory itp.
}
Teraz potrzebuję przeciążyć operatory [][] w taki sposób, że kiedy wezmę obiekt Przedział ob równy [-2, 6] i zapiszę: ob[4][2] to mój przedział [-2, 6] zostanie podzielony na 4 cześci i dostanę 2 z nich, czyli w tym wypadku [0, 2] (chyba, że mi się źle policzyło xD).
Bardzo proszę o pomoc, gdyż jest to program nad którym siedzę od poniedziałku i do końca brakuje mi tylko tego
Możesz przeciażyć tylko pojedynczy []. Jeśli chesz mieć podwójny, to pierwszy [] musi zwrócić coś, na czym wywołasz drugi [].
Możesz np. użyć klasy pomocniczej, której obiekt będzie przechowywał wskaźnik/referencję na twój Przedzial oraz pierwszy argument. Ten pomocniczy obiekt będziesz zwracał z pierwszego [] użytego na Przedzial, natomiast kolejny [] użyty na obiekcie pomocniczym będzie wykonywał właściwą operację.
Coś w stylu
class A
{
public:
class proxy
{
friend class A;
A& m_a;
int m_x;
proxy(A& a, int x) : m_a(a), m_x(x) {}
public:
int& operator [] (int y) { return m_a.at(m_x, y); }
};
int& at(int x, int y);
proxy operator[] (int x) { return proxy(*this, x); }
};
Dziękuję za pomoc - zrobiłem to i działa, tylko jest jeden problem…
Muszę to zakodować w następujący sposób: w plikach nagłówkowych mam mieć tylko definicję funkcji, a w plikach cpp ich opis. I próbuję to zrobić, ale nie mogę sobie z tym poradzić.
int foo(); //deklaracja funkcji
struct X
{
int bar(); //deklaracja metody
static int y; //deklaracja pola statycznego
};
extern int z; //delaracja zmiennej
int foo() //definicja funkcji
{
return 42;
}
int X::bar() //definicja metody
{
return 42;
}
int X::y = 42; //definicja pola statycznego
int z = 42; //definicja zmiennej
Wykorzystanie operatorów indeksowania miałoby w tym przypadku większy sens, gdyby pierwszy indeks zwracał tablicę przedziałów, otrzymanych w wyniku podziału bazowego przedziału, a drugi indeks zwracał konkretny element z tejże tablicy:
#include
class Przedzial
{
double Low, Up;
public:
Przedzial(double low, double up) : Low(low), Up(up) {}
std::vector operator[](int c) const
{
double g = (Up - Low) / c;
std::vector v;
for (int x = 0; x < c; ++x)
{
v.push_back(Przedzial(Low + g * x, Low + g * (x + 1)));
}
return v;
}
};
Przykład zastosowania:
Przedzial a(-2, 6);
Przedzial b = a[6][4];
Przedzial c = a[3][2][2][0];
std::vector przedzialy = a[6];
Trzeba tylko zwrócić uwagę, że w powyższej implementacji, przedziały w tablicy indeksowane są od 0 a nie od 1.