previous next Up Title Contents Index

18.3 Binäärisen operaation kuormitus

Vastaavasti kuin binäärisiä << ja >> - operaattoreita, voidaan myös muitakin binäärisiä operaattoreita kuormittaa. Binääristä operaatiota kuormitettaessa vähintään toisen operandin tulee olla luokka (eli ei skalaari kuten int, double jne.)

Olkoon meillä vaikkapa luokka, joka kuvaa hyvin usein vastaan tulevaa tilannetta, jossa käytössä onkin hyvin rajoitettu kokonaislukualue (esim. kellon minuutit [0,59[, tunnit [0,24[ jne.):

operator\rajoit.cpp - esimerkki binäärisen operaation kuormituksesta

	#include <iostream.h>
	class cRajoitettu {
	  int arvo;
	  int raja;
	public:
	  int aseta(int aarvo) {
	    arvo = aarvo;
	    int yli = arvo/raja;
	    arvo %= raja;
	    return yli;
	  }
	
	  cRajoitettu(int aarvo, int araja) {
	    raja = araja; if ( raja < 1 ) raja = 1;
	    aseta(aarvo);
	  }
	  int Arvo() const { return arvo; }
	  int Raja() const { return raja; }
	};
	
	ostream &operator<<(ostream &os, const cRajoitettu &r) {return os << r.Arvo(); }
	
	cRajoitettu operator+(const cRajoitettu &r1, int i)
	{
	  return cRajoitettu(r1.Arvo()+i,r1.Raja());
	}
	
	int operator+(int i,const cRajoitettu &r2)
	{
	  return i+r2.Arvo();
	}
	
	int main(void)
	{
	  cRajoitettu m1(55,60),m2(20,60);
	  int i;
	  cout << m1 << " " << m2 << "\n";
	  m2 = m1 + 20;
	  cout << m1 << " " << m2 << "\n";
	  i = 20 + m2;
	  cout << i << "\n";
	  return 0;
	}
Tässä ensimmäinen + - operaattori voitaisiin tehdä myös luokan metodiksi:

operator\rajoit2.cpp - esimerkki operaatioden kuormituksesta

	#include <iostream.h>
	class cRajoitettu {
	...
	  cRajoitettu operator+(int i)  { return cRajoitettu(arvo+i,raja);  }
	};
Tämä näyttää yksi- parametriselta operaattorilta, mutta on tosiasiassa binäärinen, nimittäin vasempana operandina on *this.
	m2 = m1.operator+(20);


previous next Up Title Contents Index