Strona 1 z 1

[C++] Wyjaśnienie części kodu

: 16 grudnia 2007, 20:00
autor: dawideo
Hey czy może mi ktoś wyjaśnić część kodu?? Chodzi mi tylko o to co robi w tym przykładzie konstruktor beparametrowy i destruktor??? Bo jakoś nie mogę do tego dojść
A oto kod

Kod: Zaznacz cały

#include <iostream.h>
#include <conio.h>

class Prostokat  {

friend Prostokat operator*(Prostokat a, Prostokat b);     //operator * umozliwiajacy mnozenie pol obiektow uzywajac "nazw/wskaznikow" obiektow
friend Prostokat operator/(Prostokat a, Prostokat b);     //operator / umozliwiajacy dzielenie pol obiektow uzywajac "nazw/wskaznikow" obiektow

protected:
          float pole;
          float x, y;
public:

       virtual float poleProstokata () {return pole = (x*y);}
       Prostokat () {}                                   //konstruktor obiektu bez param.
       Prostokat (float, float);                         //konstruktor obiektu z zadanymi param.
       ~Prostokat() { }                                  //destruktor obiektu
       float PoleP()  { return Prostokat: :p ole; }        //funkcj zwracjaca pole obiektu.

};

Prostokat::Prostokat (float a, float b)
       {
       x = a;
       y = b;
       }

//***************************OPERATOR * *************************************/
Prostokat operator* (Prostokat a, Prostokat b)           
 {
  Prostokat c;
  c.pole = a.pole * b.pole;
  return c;
 }

//***************************OPERATOR / **************************************/

Prostokat operator/ (Prostokat a, Prostokat b)
 {
  Prostokat c;
  c.pole = a.pole / b.pole;
  return c;
 }

class Krzyzyk1 :p ublic Prostokat {

public:
        virtual float poleKrzyzyka1 () { return pole = ((2*(x*y))-(y*y)); }
        Krzyzyk1() ;
	Krzyzyk1(float, float);

};

Krzyzyk1::Krzyzyk1 (float a, float b)
    {
    x = a;
    y = b;
    }


class Krzyzyk2 :p ublic Prostokat{

public:
       virtual float poleKrzyzyka2 () { return pole = ( (4*(x*y))-(4*(y*y)) ); }
       Krzyzyk2 ();
       Krzyzyk2 (float, float);

};
Krzyzyk2::Krzyzyk2 (float a, float b)
    {
    x = a;
    y = b;
    }

//***********************************MAIN***********************************//
main ()
{

    Prostokat *a = new Prostokat (2, 1);
    Prostokat *b = new Prostokat(4, 2);
    Krzyzyk1 *c = new Krzyzyk1 (2, 1);
    Krzyzyk1 *d = new Krzyzyk1 (4, 2);
    Krzyzyk2 *e = new Krzyzyk2 (2, 1);
    Krzyzyk2 *f = new Krzyzyk2 (4, 2);

    cout << "Pole prostokata 'a' wynosi : " << a->poleProstokata() << endl;
    cout << "Pole prostokata 'b' wynosi : " << b->poleProstokata() << endl;
    cout << "Pole krzyzyka (+) 'c' wynosi : " << c->poleKrzyzyka1() << endl;
    cout << "Pole krzyzyka (+) 'd' wynosi : " << d->poleKrzyzyka1() << endl;
    cout << "Pole krzyzyka (#) 'e' wynosi : " << e->poleKrzyzyka2() << endl;
    cout << "Pole krzyzyka (#) 'f' wynosi : " << f->poleKrzyzyka2() << endl;

    cout << "\nIloczyn pol prostokatow : 'a' i 'b' = "
         << (*a * *b).PoleP() << endl;

    cout << "\nIloraz pol prostokata 'b' i krzyzyka(+) 'c' = "
         << (*b / *c).PoleP() << endl;

    cout << "\nIloczyn pol krzyzykow(+): 'c' i 'd' = "
         << (*c * *d).PoleP() << endl;

    cout << "\nIloczyn pol krzyzyka(+) 'd' i krzyzyka(#) 'e' = "
         << (*d * *e).PoleP() <<endl;

    cout << "\nIloczyn pol prostokat 'a' i krzyzyka(#) 'e' "
         << (*a * *e).PoleP() <<endl;

    delete a;
    delete b;
    delete c;
    delete d;
    delete e;
    delete f;

    cout << "\nNacisnij dowolny przycisk..." << endl;
    getchar();
}

: 16 grudnia 2007, 20:11
autor: Theq
Nic nie robi

: 16 grudnia 2007, 20:12
autor: dawideo
Skoro nic nie robi to po co on tam wogóle jest????

: 16 grudnia 2007, 20:20
autor: Killavus
Nawyk programistyczny. Dość głupi zresztą :) .

Pozdrawiam.

: 16 grudnia 2007, 20:21
autor: Theq
Ogolnie to kod za ciekawy nie jest, (np to tworzenie obiektow przez new zamiast poprostu Prostokat a(2,1) ). Moze ktos chcial miec mozliwosc tworzenia obiektu bez podania parametru.

: 16 grudnia 2007, 20:26
autor: dawideo
Czyli jeśli dobrze rozumiem tego konstruktora jak i destruktora tam równie dobrze może wogóle nie być??
P.s. "new i delete" gościu się tłumaczył że chciał pokazać coś specyficznego dla języka C++ (chyba chodzi mu o to że w innych językach takiego czegoś nie ma :]) ale ja się nie znam :P więc jak narazie mu wierze :P

P.s Przeglądając dalej kod zauważyłem że autor również w klasach pochodnych posłużył się konstruktorem domyślnym (Krzyżyk1(); Krzyżyk2() ;) rozumiem że tam one też nic nie robia??? Bo te z parametrami to jasna sprawa.

: 16 grudnia 2007, 22:03
autor: grygus
Jeśli o mnie chodzi to destruktor w klasie bazowej powinien być tylko że virtual . Akurat w tym przykładzie nie jest on konieczny ale to tak apropo dobrych nawyków :)