Avatar billede mollevp Nybegynder
08. juli 2005 - 16:50 Der er 11 kommentarer og
1 løsning

Overload af operator

Hejsa jeg sidder og prøver at få styr på operator overloading.
Jeg har lavet lidt forskellige implementeringer, men er lidt i
tvivl om der er ulemper eller fordele ved de forskellige måder at
gøre det på. Her er et lille eksempel:

Første måde:

class Point
{
public:
    (constructor osv)
    friend Point operator - (const Point &, const Point &);

protected:
    double _x,_y;
};

Point operator - (const Point &pkt1, const Point &pkt2)
{
    Point temp;
    temp._x = pkt1._x - pkt2._x;
    temp._y = pkt1._y - pkt2._y;

    return temp;
}

Anden måde:

class Point
{
public:
    (constructor osv)
    Point operator - (const Point &);

protected:
    double _x,_y;
};

Point Point::operator - (const Point &pkt)
{
    Point temp;
    temp._x = _x - pkt._x;
    temp._y = _y - pkt._y;

    return temp;
}

Er der nogel fordele eller ulemper ved at bruge den ene fremfor den anden
såvidt jeg kan se gør det ingen forskel?

Hvis der er nogle der ligger inde med nogle lækre tutorials/artikler ect.
om emnet vil jeg sætte stor pris på dem..
Avatar billede arne_v Ekspert
08. juli 2005 - 17:23 #1
2 hoved regler:

1)  friend funktioner er langt mere fleksible da de kan have andre typer
    som venstre side argument (for operatorer med 2 argumenter)

2)  hvis friend funktionen ikke modificerer nogle af argumenterne er det
    OK ud fra en encapsulation synsvinkel

så jeg ville altid vælge den første måde !
Avatar billede arne_v Ekspert
08. juli 2005 - 17:25 #2
der står lidt om det i Bjarne Stroustrup's C++ bog og også lidt i Maz Spork's bog
Avatar billede mollevp Nybegynder
08. juli 2005 - 18:22 #3
Ok.. tror jeg vil låne Stoustrups bog på biblioteket så..

>> 1)  friend funktioner er langt mere fleksible da de kan have andre typer
>>  som venstre side argument (for operatorer med 2 argumenter)

Hermed menes: At man fx. ville kunne Class1 + Class2 med en dertil konstrueret operatror overload? Selvom at Class1 og Class2 er forskellige klasser?
Avatar billede arne_v Ekspert
08. juli 2005 - 18:25 #4
ja

eller måske mere realistisk: først laver du Point+double men beslutter dig så
for også at lave double+Point
Avatar billede mollevp Nybegynder
08. juli 2005 - 18:33 #5
Ok, lige for at kontrollere at jeg har forstået det korrekt:

Point+double - Ville være nem nok at lave på begge måder med:
friend Point operator + (const Point &, const double &);
eller
Point operator + (const double &dbl);

double+point ville dermod være klart nemmere med en
friend Point operator + (const double &, const Point &);
med "den anden metode" ville det dermod være en del mere kompliceret, og involvere at man overloaded operator på std::double ?

Har jeg fat i det?
Avatar billede arne_v Ekspert
08. juli 2005 - 18:41 #6
det er ikke kompliceret at overloade std::double

det er umuligt
Avatar billede mollevp Nybegynder
08. juli 2005 - 18:48 #7
Ok, men det andet var rigtigt nok? Jeg har set folk gøre det på std::ostream - hvorfra kan man se om det er muligt?

Mvh Morten
Avatar billede arne_v Ekspert
08. juli 2005 - 18:58 #8
du kan override på alle klasser men ikke på de simple datatyper
Avatar billede arne_v Ekspert
08. juli 2005 - 18:58 #9
class x : ostream
{
}

er OK

class X : double
{
}

er ikke OK
Avatar billede arne_v Ekspert
08. juli 2005 - 19:00 #10
og jeg tror at virkeligt har forstået operator overloading
Avatar billede mollevp Nybegynder
08. juli 2005 - 19:16 #11
Ok.. takker for svarene..
Avatar billede bertelbrander Novice
09. juli 2005 - 00:08 #12
Jeg vil normalt vælge anden metode, fordi jeg synes at det er logisk at operatorer der virker på et object af en class, er member i class'en.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester