[ fanfare @ 08.01.2010. 22:52 ] @
Moze li neko da mi pomogne oko veza izmedju klasa,kod agregacije.Nikako da svarim, pojam mi je donekle jasan ali sam nacin implementacije koda nije.Dobijo sam zadatak, i pokusao nesto saam,ali neide?
Evo zadatka:

Na osnovu dijagrama klasa sa slike treba realizovati program kojim se implementiraju sve
navedene klase. Svaka klasa treba (minimalno) da ima članove prikazane na dijagramu.
Klasa Poligon treba da se definiše kao apstraktna klasa (funkcije članice su čiste virtuelne).
Ostale klase treba da se implementiraju kao konkretne klase, tj. odgovarajuće čiste virtuelne
funkcije članice klase Poligon treba da se definišu (redefinišu) u izvedenim klasama.
Klasa Tacka predstavlja apstrakciju tačaka u koordinatnom sistemu x0y. Svaka tačka opisana je
uređenim parom (x,y), gdje x i y predstavljaju odgovarajuće koordinate u sistemu x0y.
Svaki objekat klase Poligon predstavlja kompoziciju od n (n≥2) tačaka (što je na UML dijagramu
klasa i prikazano kao odgovarajuća kompozicija).
Klasa Duz predstavlja apstrakciju duzi u ravni x0y. Svaku duz definišu dvije tačke: (x1,y1)-
(x2,y2). Za svaku duž može da se dobije dužina.
Klasa Trougao predstavlja apstrakciju trougla u ravni x0y. Svaki trougao definišu tri
(nekolinearne) tačke: (x1,y1)-(x2,y2)-(x3,y3). Za svaki trougao može da se dobije obim i površina.
Klasa Četvorougao predstavlja apstrakciju četvorougla u ravni x0y. Svaki četvorougao definišu
četiri tačke (među kojima ne postoje tri kolinearne tačke): (x1,y1)-(x2,y2)-(x3,y3)-(x4,y4). Za svaki
četvorougao može da se dobije obim i površina.




Ovo je moj pokušaj:

Code:
#include <iostream>

using namespace std;

class Tacka 
{
      public:
             Tacka(double xx,double yy): x(xx),y(yy) {}
      protected:
                double x;
                double y; 
};
class Poligon : public Tacka
{
      public:
             virtual void print()=0;
             virtual double obim() =0;
             virtual double povrsina() =0;
             Tacka *tacka;
};
class Duz : public Poligon
{
      public:
             Duz(double x1,double y1,double x2,double y2): Tacka A(x1,y1),Tacka B(x2,y2) {}
             void print() { cout<<"Duz sa kordinatama:"<<endl;
                             }
};

[ BinaryRuler @ 08.01.2010. 23:21 ] @
Postu dijagram to bi bilo lepo bar samo klase i relacije nemoras artibute i metode da stavis u dijagram.

Klasa poligon ne treba da nasledjuje klasu tacka. to je greska.
[ weeboo @ 08.01.2010. 23:51 ] @
Binary Ruler je u pravu, klasa Poligon ne treba da nasljedjuje klasu Tacka.
Klase Duz, Trougao i Cetverougao odnosno njihovi objekti treba da budu instancirani odredjenim brojem tacaka (u zavisnosti koji lik je u pitanju).
Evo nesto sa predavanja, posto vidim da je zadatak sa ETF-a u BL. ;)




[ mmix @ 09.01.2010. 08:27 ] @
Agregacija se razlikuje od kompozicije po vlasnistvu nad ukljucenim instancama, u kompoziciji ti brines u agregaciji ne. Najdirektniji nacin da pokazes agregaciju je da konstruktor definises tako da prima gotove tacke a ne koordinate tacaka, npr:


Code:

class Duz 
{
      public:
             Duz(Tacka* A, Tacka* B): t1(A),  t2(B) {}
             Tacka* t1;
             Tacka* t2;
...
[ fanfare @ 09.01.2010. 22:06 ] @
zaboravio sam postovati dijagram klasa,pa zato to tek sada radim!
klase i njihove veze
[ BinaryRuler @ 09.01.2010. 22:10 ] @
Ne radi ti link tj. nemam pristup. Uploaduj na ES.
[ fanfare @ 10.01.2010. 12:21 ] @
Ako neradi link ,evoga upload:

[ BinaryRuler @ 10.01.2010. 13:24 ] @
Code:

class Tacka 
{
      public:
             Tacka(double xx,double yy): x(xx),y(yy) {}
             void setX(double xx) {x=xx;}
             double getX() {return x;}
             void setY(double yy) {y=yy;}
             double getY() {return y;}
      private:
                double x;
                double y; 
};
class Poligon
{
      public:
             virtual void print()=0;
             virtual double obim() =0;
             virtual double povrsina() =0;
      protected:
             Tacka *tacka;
};

class Duz : public Poligon
{
      public:
             Duz(Tacka T1, Tacka T2){tacka = new Tacka[2]; tacka[0]=T1; tacka[1]=T2;}
             void print() { cout<<"Duz sa kordinatama:"<<endl;}
};

class Trougao : public Poligon
{
      public:
             Trougao(Tacka T1, Tacka T2, Tacka T3){tacka = new Tacka[3]; tacka[0]=T1; tacka[1]=T2; tacka[2]=T3;}
             void print() {}
};

class Cetvorougao : public Poligon
{
      public:
             Cetvorougao(Tacka T1, Tacka T2, Tacka T3, Tacka T4){tacka = new Tacka[4]; tacka[0]=T1; tacka[1]=T2; tacka[2]=T3; tacka[3]=T4;}
             void print() {}
};

Ovako dobijas trazenu strukturu. Ostaje da dodas destruktore i metode koje rade nesto sa tim tackama.
[ fanfare @ 10.01.2010. 21:33 ] @
Kako da redefinisem konstruktore za klase Duz,Trougao,Cetvorougao?

Stalno dobivam poruke kada kompajliram tip:

In constructor `Duz::Duz(Tacka, Tacka)':
no matching function for call to `Tacka::Tacka()'
candidates are: Tacka::Tacka(const Tacka&)
Tacka::Tacka(double,double)

In constructor `Trougao::Trougao(Tacka, Tacka, Tacka)':
no matching function for call to `Tacka::Tacka()'
candidates are: Tacka::Tacka(const Tacka&)
Tacka::Tacka(double,double)

In constructor `Cetvorougao::Cetvorougao(Tacka, Tacka, Tacka,Tacka)':
no matching function for call to `Tacka::Tacka()'
candidates are: Tacka::Tacka(const Tacka&)
Tacka::Tacka(double,double)


Evo mog koda:

Code:

#include<iostream>
#include <cmath>

using namespace std;

class Tacka 
{
      public:
             Tacka(double xx,double yy): x(xx),y(yy) {}
             void setX(double xx) {x=xx;}
             double getX() {return x;}
             void setY(double yy) {y=yy;}
             double getY() {return y;}
             friend ostream& operator<<(ostream& out,Tacka& tt)  // ispisivanje
                { return out <<"("<<tt.x<<","<< tt.y<<")" ; }
      private:
                double x;
                double y; 
};
class Poligon
{
      public:
             virtual void print()=0;
             virtual double obim() =0;
             virtual double povrsina() =0;
             virtual ~Poligon(){}
      protected:
             Tacka *tacka;
};

class Duz : public Poligon
{
      public:
             Duz(Tacka T1, Tacka T2){tacka = new Tacka[2]; tacka[0]=T1; tacka[1]=T2;}
             void print() ;           
};
void Duz::print()
{
     cout<< "Duz sa tackama: A(" << tacka[0] << " B"<< tacka[1] << endl;
}

class Trougao : public Poligon
{
      public:
             Trougao(Tacka T1, Tacka T2, Tacka T3){tacka = new Tacka[3]; tacka[0]=T1; tacka[1]=T2; tacka[2]=T3;}
             void print();
             double a();      // stranice trougla: a
             double b();      //                   b    
             double c();      //                   c
             double obim();
             double povrsina();
             ~Trougao () { delete [] tacka ;}
             
};
void Trougao ::print()
{
     cout<<"Trougao sa tackama: "<<tacka[0]<<" B"<<tacka[1]<<" C"<<tacka[2]<<endl;
}
double Trougao::a()
{
       double a=0;
       a=sqrtf(pow(tacka[0].getX()-tacka[1].getX(),2)+pow(tacka[0].getY()-tacka[1].getY(),2));
       return a;
}
double Trougao ::b()
{
       double b=0;
       b=sqrtf(pow(tacka[1].getX()-tacka[2].getX(),2)+pow(tacka[1].getY()-tacka[2].getY(),2));
       return b;
}
double Trougao ::c()
{
       double c=0;
       c=sqrtf(pow(tacka[0].getX()-tacka[2].getX(),2)+pow(tacka[0].getY()-tacka[2].getY(),2));
       return c;
}
double Trougao ::obim()
{
       double o=0;
       int n=3;
       cout<<"----------";
       for(int i=0;i<n-1;i++)
       o+=sqrtf(pow(tacka[i].getX()-tacka[i+1].getX(),2)+pow(tacka[i].getY()-tacka[i+1].getY(),2));
       o+=sqrtf(pow(tacka[0].getX()-tacka[n-1].getX(),2)+pow(tacka[0].getY()-tacka[n-1].getY(),2));
       return o; 

double Trougao ::povrsina()
{
       double p=0;
       double s=0;
       s=(Trougao::obim()/2);
       p=sqrtf(  (  s * (s-Trougao::a()) * (s-Trougao::b()) * (s-Trougao::c())  )  );
       return p;
}


class Cetvorougao : public Poligon
{
      public:
             Cetvorougao(Tacka T1, Tacka T2, Tacka T3, Tacka T4){tacka = new Tacka[4]; tacka[0]=T1; tacka[1]=T2; tacka[2]=T3; tacka[3]=T4;}
             void print();
             double obim();
             double povrsina();
             ~Cetvorougao () { delete [] tacka; }
};
void Cetvorougao :: print()
{
     cout<<"Cetvorougao sa tackama: "<<tacka[0]<<" B"<<tacka[1]<<" C"<<tacka[2]<<" D"<<tacka[3]<<endl;
}
double Cetvorougao :: obim()
{
       double o=0;
       int n=4;
       cout<<"----------";
       for(int i=0;i<3;i++)
       o+=sqrtf(pow(tacka[i].getX()-tacka[i+1].getX(),2)+pow(tacka[i].getY()-tacka[i+1].getY(),2));
       o+=sqrtf(pow(tacka[0].getX()-tacka[n-1].getX(),2)+pow(tacka[0].getY()-tacka[n-1].getY(),2));
       return o; 
}  
[ BinaryRuler @ 10.01.2010. 21:53 ] @
Moras da imas i konstruktor
Tacka() {...} u klasi Tacka tj podrazumevani konstruktor ili mozes da stavis u vec navedeni konstruktor podrazumevane vrednosti tj. ovu liniju

Tacka(double xx,double yy): x(xx),y(yy) {}

da zamenis sa ovom linijom

Tacka(double xx=0,double yy=0): x(xx),y(yy) {}


[ fanfare @ 11.01.2010. 00:25 ] @
Imam Problem oko ispisa kordinata tacaka svih klasa.

Code:
#include<iostream>
#include <cmath>

using namespace std;

class Tacka 
{
      public:
             Tacka(double xx=0,double yy=0): x(xx),y(yy) {}
             void setX(double xx) {x=xx;}
             double getX() {return x;}
             void setY(double yy) {y=yy;}
             double getY() {return y;}
             friend ostream& operator<<(ostream& out,Tacka& tt)  // ispisivanje
                { return out <<"("<<tt.x<<","<< tt.y<<")" ; }
      private:
                double x;
                double y; 
};
class Poligon
{
      public:
             virtual void print()=0;
             virtual double obim() =0;
             virtual double povrsina() =0;
             virtual ~Poligon(){}
      protected:
             Tacka *tacka;
};

class Duz : public Poligon
{
      public:
             Duz(Tacka T1, Tacka T2){tacka = new Tacka[2]; tacka[0]=T1; tacka[1]=T2;}
             void print() ;
             double obim(){return 0;}
             double povrsina(){return 0;}           
};
void Duz::print()
{
     cout<< "Duz sa tackama: A" << tacka[0] << " B"<< tacka[1] << endl;
}

class Trougao : public Poligon
{
      public:
             Trougao(Tacka T1, Tacka T2, Tacka T3){tacka = new Tacka[3]; tacka[0]=T1; tacka[1]=T2; tacka[2]=T3;}
             void print();
             double a();      // stranice trougla: a
             double b();      //                   b    
             double c();      //                   c
             double obim();
             double obimK(){double o=0; o=a()+b()+c(); return o; }
             double povrsina();
             ~Trougao () { delete [] tacka ;}
             
};
void Trougao ::print()
{
     cout<<"Trougao sa tackama: "<<tacka[0]<<" B"<<tacka[1]<<" C"<<tacka[2]<<endl;
     cout<<"duzine stranica su: a="<<Trougao::a()<<" ,b="<<Trougao::b()<<" ,c="<<Trougao::c()<<endl;
}
double Trougao::a()
{
       double a=0;
       a=sqrtf(pow(tacka[0].getX()-tacka[1].getX(),2)+pow(tacka[0].getY()-tacka[1].getY(),2));
       return a;
}
double Trougao ::b()
{
       double b=0;
       b=sqrtf(pow(tacka[1].getX()-tacka[2].getX(),2)+pow(tacka[1].getY()-tacka[2].getY(),2));
       return b;
}
double Trougao ::c()
{
       double c=0;
       c=sqrtf(pow(tacka[0].getX()-tacka[2].getX(),2)+pow(tacka[0].getY()-tacka[2].getY(),2));
       return c;
}
double Trougao ::obim()
{
       double o=0;
       int n=3;
       for(int i=0;i<n-1;i++)
       o+=sqrtf(pow(tacka[i].getX()-tacka[i+1].getX(),2)+pow(tacka[i].getY()-tacka[i+1].getY(),2));
       o+=sqrtf(pow(tacka[0].getX()-tacka[n-1].getX(),2)+pow(tacka[0].getY()-tacka[n-1].getY(),2));
       return o; 

double Trougao ::povrsina()
{
       double p=0;
       double s=0;
       s=(Trougao::obim()/2);
       p=sqrt(  (  s * (s-a()) * (s-b()) * (s-c())  )  );
       return p;
}


class Cetvorougao : public Poligon
{
      public:
             Cetvorougao(Tacka T1, Tacka T2, Tacka T3, Tacka T4){tacka = new Tacka[4]; tacka[0]=T1; tacka[1]=T2; tacka[2]=T3; tacka[3]=T4;}
             void print();
             double obim();
             double povrsina(){return 0;};
             ~Cetvorougao () { delete [] tacka; }
};
void Cetvorougao :: print()
{
     cout<<"Cetvorougao sa tackama: "<<tacka[0]<<" B"<<tacka[1]<<" C"<<tacka[2]<<" D"<<tacka[3]<<endl;
}
double Cetvorougao :: obim()
{
       double o=0;
       int n=4;
       for(int i=0;i<3;i++)
       o+=sqrtf(pow(tacka[i].getX()-tacka[i+1].getX(),2)+pow(tacka[i].getY()-tacka[i+1].getY(),2));
       o+=sqrtf(pow(tacka[0].getX()-tacka[n-1].getX(),2)+pow(tacka[0].getY()-tacka[n-1].getY(),2));
       return o; 
}  

main()
{
      Duz d((1.0,2.0),(4.0,2.0));
      Trougao t((1.0,1.0),(5.0,2.0),(1.0,4.0));
      Cetvorougao c((1.0,2.0),(5.0,2.0),(1.0,5.0),(5.0,5.0));
      Poligon *p[3]= { &d, &t, &c };
      
      for (int i=0; i<3; i++)
      {
          p[i]->print();
          cout<<"     obim:"<<p[i]->obim()<<endl;
          cout<<" povrsina:"<<p[i]->povrsina()<<endl<<endl;;
      }
      
      system("pause");
}
        
       


ovo je ispis:

Duz sa tackama: A(2,0) B(2,0)
obim:0
povrsina:0

Trougao sa tackama: (1,0) B(2,0) C(4,0)
duzine stranica su: a=1 ,b=2 ,c=3
obim:6
povrsina:0

Cetvorougao sa tackama: (2,0) B(2,0) C(5,0) D(5,0)
obim:6
povrsina:0


zar nebi trebalo biti npr. za Duz: A(1,2) B(4,2)?????
[ BinaryRuler @ 11.01.2010. 01:14 ] @
Sve je ok samo nisi naveo klasu Tacka pro kreiranju objekata.
Samo dodaj Tacka ispred svake koordinate i sve radi.
Pozdrav

Code:


      Duz d(Tacka(1.0,2.0),Tacka(4.0,2.0));
      Trougao t(Tacka(1.0,1.0),Tacka(5.0,2.0),Tacka(1.0,4.0));
      Cetvorougao c(Tacka(1.0,2.0),Tacka(5.0,2.0),Tacka(1.0,5.0),Tacka(5.0,5.0));

[ fanfare @ 11.01.2010. 05:47 ] @
HVALA BinaryRuler! To je to.