[ overseer @ 08.11.2006. 01:24 ] @
Pozdrav !

Dakle problem je sljedeci, recimo da imam klasu :

class complex{
double real , imag;

//...
};


Ono sto me muci je kako da kreiram objekt pomocu ovakve naredbe, npr.:

complex c = 15;


Sta sve treba da uradim?Preklopiti operator= ?Kako rijesiti problem konverzije tipova
(iz int u complex)?

Bilo kakva pomoc je dobrodosla !
[ karas @ 08.11.2006. 08:24 ] @
Za
Code:

complex c = 15;

ne morash da preklapash operator =, dovoljno je da imash konstruktor
Code:

complex(double r);

Operator = potreban je u situaciji
Code:

complex c;
c = 15;

Drugim rechima, konstruktor se automatski poziva kada se prilikom definicije vrshi i inicijalizacija objekta. Ovakav kontruktor istovremeno obezbedjuje konverziju iz double u complex (osim ako se ne stavi explicit).
[ toxi_programer @ 08.11.2006. 16:20 ] @
@overseer
Evo, kako bi trebalo da izgleda klasa sa primerom koriscenja:


class complex{
public:
double real , imag;

complex(void) { } //default konstruktor
complex(double n) { real = n; } //konstruktor za double
};

int main(void)
{
complex a = 7777.888;
a = 1.989;

cout << "real = " << a.real << endl;
return 0;
}

@karas
Kao sto vidis nije mu potreban preopterecen operator=, jer se poziva konstruktor da
bi konvertovao tip sa desne strane jednakosti( da ne tupim zasto jer znas i sam)
[ overseer @ 08.11.2006. 16:52 ] @
Ljudi hvala vam,primjeri oprobani,sve jasno!
[ karas @ 09.11.2006. 08:19 ] @
U pravu si za ovaj primer, trebalo je drugachiji da odaberem, kao npr.
Code:

#include <iostream>

using std::cout;
using std::endl;

class complex
{
public:
    double real, imag;

    complex(void) { } //default konstruktor
    complex(double n) { real = n; } //konstruktor za double
};

int main(void)
{
    complex a = 7777.888;
    complex b = 1.989;
    a = b;

    cout << "real = " << a.real << endl;
    return 0;
}

Dakle, operator= u ovoj situaciji je implicitno definisan tj. kompajler ga je definisao na svoj nachin. To znachi da
Code:

a = b;

radi, ali ja ne bih prepushtao kompajleru da generishe operator=.
[ Dragi Tata @ 09.11.2006. 12:56 ] @
Citat:

radi, ali ja ne bih prepushtao kompajleru da generishe operator=.


Naprotiv, kompajleru treba prepuštati da generiše operator =, copy constructor i destructor kad god je to moguće. Naravno, ima puno slučajeva kad to nije dobro, ali complex je školski primer "value" tipa gde kompajler izgeneriše tačno ono što ti treba.
[ toxi_programer @ 09.11.2006. 14:41 ] @
U jednoj knjizi sam procitao da se definisanje operator=, copy constrctora i destruktora naziva "pravilo trojke" tj.ako je potrebno da inplementiras jedno od njih, trebaces i ostala dva(sto je i logicno).

##
Dakle, operator= u ovoj situaciji je implicitno definisan tj. kompajler ga je definisao na svoj nachin
##
Kao i kod kopiranja struktura i kod klasa(ako op= nije inplementiran) kopiranje se vrsi rekurzivno sto izaziva krah ako klasa vrsi bilo kakvu manipulaciju memorijom. Dok god to nije slucaj nema potrebe za explicitnim implementiranjem pomenutih f-ja.

@Dragi Tato
Stvarno nigde ne nađoh i jednostavno ne znam kad, kako i zasto se koristi virtuelni destruktor pa ako bi mogao da kazes koju o tome bio bih ti zahvalan. Procitao sam negde da si nekom liku postavio to pitanje ali odgovora nije bilo...
[ Dragi Tata @ 09.11.2006. 15:37 ] @
Citat:
toxi_programer: @Dragi Tato
Stvarno nigde ne nađoh i jednostavno ne znam kad, kako i zasto se koristi virtuelni destruktor pa ako bi mogao da kazes koju o tome bio bih ti zahvalan. Procitao sam negde da si nekom liku postavio to pitanje ali odgovora nije bilo...


Pročitao si ovde: http://www.novetehnologije.com/Default.aspx?tabid=109

Ukratko, ako postoji mogućnost da dođe do ovoga:

Code:

struct baza {
virtual ~baza(){}
};

struct izvedena : baza {};

int main() 
{
  baza* izv = new izvedena;
  delete izv;
}


Kad se pozove delete, onda se automatski pozove i destruktor. Pošto je izv pointer tipa baza*, a objekat je u stvari izvedena, onda destruktor baze mora da bude virtualan da bi se u stvari pozvao destruktor izvedena.

Znači, ako imaš klasu koja je predviđena za nasleđivanje, bolje stavi virtualni destruktor, osim ako si siguran da neće biti korišćena na gorepomenuti način.
[ karas @ 09.11.2006. 15:47 ] @
Ako operator= nije potreban stavim ga u private, a ako jeste, onda ga sam definishem. Ne znam koliko je to dobra praksa, ali oseccam se sigurnije kada ga imam na oku.:)