Newsgroup: it.comp.lang.c++
Titolo: Classe Coordinate

Buongiorno a tutti ed auguri di buon anno:) Vi giro questa traccia
d'esame con relativo mio abbozzo, sperando in un vostro
suggerimento.Grazie!
-Scrivere il codice per una classe "coordinate" che gestisce latitudine
(-90.0;+90.0) e longitudine (-180.0;+180.0) di un punto. L'oggetto può
essere inizializzato in fase di dichiarazione o con specifica funzione
membro; ha una funzione per ottenere i valori settati; è possibile
settare un oggetto a partire da somme e sottrazioni di oggetti dello
stesso tipo (A=B+C; A=B-C); valori fuori dal range vengono riportati
nel range tramite modulo (es: (+70.0;+100.0)+(+30.0;+120.0)=
(-80.0;-140.0)). Valutare l'oppurtunità/necessità di scrivere un
costruttore di copie.
class Coordinate
{
   double latitudine, longitudine;
   public:
      Coordinate(double lat, double lon) : latitudine(lat), longitudine
(lon) {
         cout<<"Costruttore..."<<endl;
      }
      Coordinate(const Coordinate& c) : latitudine(c.latitudine),
longitudine(c.longitudine) {
         cout<<"Costruttore di copia..."<<endl;
      }
      ~Coordinate() { cout<<"Distruttore..."<<endl; }
      Coordinate operator+(Coordinate& o) {
         cout<<"Overloading +..."<<endl;
         Coordinate tmp(latitudine + o.latitudine, longitudine +
o.longitudine);
         return tmp;
      }
      Coordinate operator-(Coordinate& o) {
         cout<<"Overloading -..."<<endl;
         Coordinate tmp(latitudine - o.latitudine, longitudine -
o.longitudine);
         return tmp;
      }
};

          return tmp;
Puoi scrivere semplicemente:
 
    return Coordinate(latitudine + o.latitudine, ... );
Stesso discorso per operator-.
Max

Grazie mille per l'aiuto.
Però sulla traccia ho ancora parecchi dubbi, tipo:
1-come faccio a stabilire un preciso range di coordinate per la
latitudine e longitudine?
2-L'oggetto può essere inizializzato in fase di dichiarazione o con
specifica funzione
membro;
3-ha una funzione per ottenere i valori settati;
4-valori fuori dal range vengono riportati



Meglio aggiungerne due:
    Coordinate operator+(const Coordinate& o) const {
uguale per operator-().
Nel costruttore mancano i controlli per verificare se latitudine e
longitudine siano all'interno del range specificato. Il costruttore
potrebbe costruire un oggetto "speciale" (definendo un membro statico
particolare come fa std::string::npos) - bisogna tra l'altro
ridefinire allora l'operatore==() o non ha senso - oppure lanciare
std::range_error (#include <exception>).
  #include <cmath>
  #include <exception>
  Coordinate(double latitude, double longitude) :
    m_latitude(latitude), m_longitude(longitude)
    throw (std::range_error)
  {
    using namespace std;
    if (abs(latitude) > 90.0 || abs(longitude) > 180.0)
      throw std::range_error ("Latitude or longitude outside allowed
range");
  }
Ciao,
m.

 (-80.0;-140.0)).
Questo è un problema di matematica, non di programmazione :-)
Coordinate::Coordinate (double latitude, double longitude) throw ()
  : m_latitude ((latitude + 90.0)%180.0 - 90.0),
    m_longitude ((longitude + 180.0)%360.0 - 180.0)
{
}
Ciao,
m.
PS. spero di non aver detto castronate, sono famoso per inciampare
sulle cose facili :-D

Vi ringrazio ancora, ma purtroppo è rimasto qualche piccolo inghippo:
-il compilatore aspetta "{" prima di throw;
-nella parte di codice che riporta i valori nel range, mi dice che si
cerca di ridefinire valori precedentemente già definiti;
-mi dice che gli operandi double non sono validi per l'operatore "%"

Risolto in questo modo:
#include <iostream>
#include <cmath>
using namespace std;
class Coordinate
{
   double m_latitude, m_longitude;
   public:
      Coordinate(double latitude, double longitude) : m_latitude
(latitude), m_longitude(longitude){
         cout<<"Costruttore..."<<endl;
         overload();
      }
      Coordinate() : m_latitude(0.0), m_longitude(0.0) {cout<<"Secondo
costruttore..."<<endl;}
      Coordinate(const Coordinate& c) : m_latitude(c.m_latitude),
m_longitude(c.m_longitude) {
         cout<<"Costruttore di copia..."<<endl;
         overload();
      }
      ~Coordinate() { cout<<"Distruttore..."<<endl; }
      Coordinate operator+(const Coordinate& o) const{
         cout<<"Overloading +..."<<endl;
         return Coordinate(m_latitude + o.m_latitude, m_longitude +
o.m_longitude);;
      }
      Coordinate operator-(const Coordinate& o) const{
         cout<<"Overloading -..."<<endl;
         return Coordinate(m_latitude - o.m_latitude, m_longitude -
o.m_longitude);;
      }
      void overload();
      double GetLatitude() const {return m_latitude;}
      double GetLongitude() const {return m_longitude;}
};
void Coordinate::overload()
{
   m_latitude=fmod((90+m_latitude), 180)-90;
   m_longitude=fmod((180+m_longitude), 360)-180;
}
Mi siete stati di grandissimo aiuto, vista l'imminenza dell'esame di
Fondamenti di Informatica:-(