Portál AbcLinuxu, 11. května 2025 07:06

Dotaz: pretaženie operatora s konštantou naľavo

Xgamer avatar 20.4.2011 19:04 Xgamer | skóre: 4
pretaženie operatora s konštantou naľavo
Přečteno: 173×
Odpovědět | Admin
Zdravím, mam za úlohu nakodiť "knihovnu" na základne operácie s komplexnými číslami. Samozrejme relatívne jednoduchá úloha, ktorá sa dá vyriešiť pomocou preťažovanie operátorov. Avšak v tom je aj ten problém :). Neviem totiž ako spraviť aby mi fungovalo napríklad niečo takéto c1 = 2 * c1 Opačne čiže c1*2 funguje bezproblémovo, ale neviem ako spraviť aby to fungovalo aj naopak, neviem ako to zapísať. Ďakujem za pomoc
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

20.4.2011 19:29 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
Odpovědět | | Sbalit | Link | Blokovat | Admin

Je potřeba, aby vaše třída měla konstruktor, který půjde volat s jedním reálným parametrem, tj. např.

class Cplx {
protected:
  double x;
  double y;
public:
  Cplx(double xx=0.0, double yy=0.0) : x(xx), y(yy) {}
};
20.4.2011 19:35 Sten
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jednoduše udělejte operátor mimo třídu a se dvěma parametry:
Complex operator *(const double &left, const Complex &right);
Xgamer avatar 21.4.2011 20:11 Xgamer | skóre: 4
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
Ano tak by to šlo ale gcc mi stále hlasi že už mam viacnasobnu definiciu operatora. Ide o to že ja potrebujem spraviť:
Complex operator *(Complex &c1, Complex &c2)
Complex operator *(const double &num, Complex &c)
Complex operator *(Complex &c, const double &num)
Som z toho trošku jeleň, na googli nemožem nič rozumne k tomu najsť niečo čo by riešilo všetky pripady ako potrebujem ja... Ako som pochopil tak to nemožem všetko nadefinovať ako metody, resp. v tele triedy ale ako friend funkcie no ani tak mi to nefunguje.

Časť triedy:
class Complex
{
    public:
        Complex(){};
        Complex(double re, double im);
        friend Complex operator * (Complex &c1,const double &num) ;
        friend Complex operator * (const double &num, Complex &c1) ;
        friend Complex operator * (Complex &c1, Complex &c2);
        void Display();
    private:
        double re;
        double im ;
};
Ďakujem za pomoc :)
21.4.2011 20:33 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
A zkoušel jste to, co jsem vám poradil v první odpovědi?
Xgamer avatar 21.4.2011 21:54 Xgamer | skóre: 4
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
Skúšal som to, stale mi to hlási viacnásobná definicia...
21.4.2011 22:18 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo

V tom případě ukažte, co přesně jste zkoušel, protože to funguje:

#include <iostream>

class C {
public:
  double x;
  double y;
  C(double xx=0.0, double yy=0.0) : x(xx), y(yy) {}
};

inline const C operator * (const C& a, const C& b)
{
  return C(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);
}

int main()
{
  C a(3,5);
  C b;

  b = 2 * a;

  std::cout << b.x << " + " << b.y << "i\n";

  return 0;
}
21.4.2011 20:43 __dark__
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
A nemělo by to být spíš takto?
Complex operator *(const Complex &c1, const Complex &c2)
Complex operator *(const double &num, const Complex &c)
Complex operator *(const Complex &c, const double &num)
A napiš to mimo tělo té třídy, jak radil Sten.
21.4.2011 21:06 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
Není u double ta konstantní reference trochu overkill?
Xgamer avatar 21.4.2011 21:58 Xgamer | skóre: 4
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
Neviem, tak sa v tom nevyznam :)vždy to bude len konštatne čislo tak neviem. Každá nová vedomosť je dobrá :)
21.4.2011 22:21 Sten
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
No jak na které architektuře, jsem holt zvyklej na ty starý (16-bit, 32-bit), kde bylo lepší všechno, co je větší než registr a není konstanta, předávat referencí, ale na 64-bitovém počítači už se double vejde do registru, tak tam je to zbytečný.
21.4.2011 23:28 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
Nejenom zbytečné. Pokud to totiž budete opravdu předávat přes pointer (který je mimochodem stejně velký jako double), znamená to zdržení na jeho dereferencování. V praxi je ale samozřejmě otázka, co z toho v konkrétním případě udělá kompilátor.
Xgamer avatar 21.4.2011 21:56 Xgamer | skóre: 4
Rozbalit Rozbalit vše Re: pretaženie operatora s konštantou naľavo
No vyzerá to že si prehádzal len poradie? No nenapadlo ma že by to s tým niečo mohlo mať, ale skusil som to a stale to iste:( ono pokial nemam zadefinovaný operator pre riešenie ked je na lavej strane tá konštanta tak to ide...

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.