[C++]Przeciążenie podwójnego operatora [][]

Witam.

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 :frowning:

Z góry dziękuję za pomoc i pozdrawiam

IcyMat

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); }

};

Do poczytania: http://xion.org.pl/2010/06/01/dwukierunkowe-funkcje-i-obiekty-proxy/

Miłej zabawy :smiley:

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ć.

W plikach nagłówkowych tylko deklarację, w plikach źródłowych definicję? Jeśli tak, to napisz z czym konkretnie masz problem.

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

Robi się to tak:

klasa.hpp

#ifndef KLASA_HPP

#define KLASA_HPP


#include i inne potrzebne nagłówki


class KLASA

{

    public:

        KLASA();

        void funkcja();

        ~KLASA();

}

#endif

klasa.cpp

#include "KLASA.hpp"


KLASA::KLASA()

{

...

}

void KLASA::funkcja()

{

...

}

 KLASA::~KLASA()

{

...

}

Kompilujesz tylko pliki .cpp pliki .hpp mają byśtylko jakby spisem treści klasy :smiley: Pozdrawiam.

Bardzo dziękuję za pomoc :wink:

Uratowaliście moje zadanie ^^

Teraz tylko skończyć resztę i będzie git…

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.

Cóż… mój problem może nie mieć sensu z punktu widzenia logiki, ale to są studia - tutaj prawie nic nie jest logiczne :wink:

Tutaj nie problem ma mało sensu a sposób jego rozwiązania.