Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
autor |
|
asjameez
Kreisi kasutaja

liitunud: 10.12.2006
|
10.09.2010 18:24:48
Valutu cout voog |
|
|
Mul on klass aeg, mis koosneb intidest tund, minut ja sekund. Proovin kirjutada operaatorit, et saaks aja valutult cout voogu lasta. Mingil kummalisel kombel pritsitakse väljundisse hoopis mäluaadress (näiteks 0x1494050).
.h
Spoiler 
#include <iostream>
using namespace std;
class Aeg {
private:
int Tund, Minut, Sekund;
public:
Aeg();
Aeg(int, int, int);
int KysiTunnid();
int KysiMinutid();
int KysiSekundid();
Aeg operator + (Aeg);
Aeg operator - (Aeg);
ostream & operator << (ostream &);
Aeg Arvuta(Aeg);
void Tryki();
};
|
operaator
Spoiler 
ostream & Aeg::operator << (ostream & Output) {
Output << KysiTunnid() << ":" << KysiMinutid() << ":" << KysiSekundid() << " ";
return Output;
}
|
cout
Spoiler 
Aeg *a = new Aeg(10, 00, 50);
cout << a << endl;
|
Pikka aega jamasin kahe parameetriga operaatoris. Lõpuks läksin ühele parameetrile üle nagu praegu ja programm kompileerub, kuid nagu alguses ütlesin, siis väljund ei ole päris see mis ta olema peaks.
Keegi mõistab vea olemust?
|
|
Kommentaarid: 63 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
61 |
|
tagasi üles |
|
 |
murka_
HV vaatleja
liitunud: 05.08.2008
|
10.09.2010 19:23:37
|
|
|
ostream-ist lugemiseks on vaja teha nt:
std::ostram output
cout<<output.rdbuf() |
Ja kuna aeg a on viit, siis ta peabki tagastama aadressi, kui otse printida.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
DoS
HV veteran

liitunud: 19.08.2002
|
10.09.2010 19:46:23
|
|
|
c++:
|
#include <iostream> using namespace std; class Aeg { private: int Tund, Minut, Sekund; public: Aeg(); Aeg(int, int, int); int KysiTunnid(); int KysiMinutid(); int KysiSekundid(); Aeg operator + (Aeg); Aeg operator - (Aeg); friend ostream& operator << (ostream&, Aeg*); Aeg Arvuta(Aeg); void Tryki(); }; ostream &operator<<(ostream &stream, Aeg* aeg) { Output << aeg->KysiTunnid() << ":" << aeg->KysiMinutid() << ":" << aeg->KysiSekundid() << " "; return Output; }
|
võiks töötada.
|
|
Kommentaarid: 50 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
47 |
|
tagasi üles |
|
 |
asjameez
Kreisi kasutaja

liitunud: 10.12.2006
|
10.09.2010 19:53:43
|
|
|
DoS, suured tänud
Ehk oskad paari lausega selgitada, miks operator<< ei või olla klassi Aeg member?
|
|
Kommentaarid: 63 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
61 |
|
tagasi üles |
|
 |
DoS
HV veteran

liitunud: 19.08.2002
|
10.09.2010 20:06:51
|
|
|
Hetkel ei oska, kuna hakkasin alles täna c++'i lähemalt uurima. Operator overloading ei ole ilmselt kõige parem koht ka, kust alustada
|
|
Kommentaarid: 50 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
47 |
|
tagasi üles |
|
 |
murka_
HV vaatleja
liitunud: 05.08.2008
|
10.09.2010 20:23:16
|
|
|
See operaator võib olla member funktsioon, aga ei ole tavakohane. Operaatorid, mis ei muuda andmeid võiksid olla friend funktsioonid.
Natuke teemakohast lugemist: link
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
10.09.2010 23:19:08
|
|
|
murka_ kirjutas: |
Natuke teemakohast lugemist: link |
Mulle tundub ebaotstarbekas mingite häguste ideaalide nimel kohitseda ära IDE poolt pakutav code-completion.
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
andreie
HV vaatleja

liitunud: 09.09.2006
|
12.09.2010 12:09:31
|
|
|
Need "hägused ideaalid" olid minu arust päris hästi lahti seletatud. Mis jäi segaseks?
_________________ Unix survives only because everyone else has done so badly. |
|
Kommentaarid: 5 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
5 |
|
tagasi üles |
|
 |
murka_
HV vaatleja
liitunud: 05.08.2008
|
12.09.2010 13:28:03
|
|
|
Code-completion jaoks võib ju kõik seotud koodi ühte namespace-i panna.
|
|
Kommentaarid: 4 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
4 |
|
tagasi üles |
|
 |
Ohohh
Kreisi kasutaja

liitunud: 13.09.2003
|
12.09.2010 18:44:33
|
|
|
andreie kirjutas: |
Need "hägused ideaalid" olid minu arust päris hästi lahti seletatud. Mis jäi segaseks? |
Seletas jah, et siis klass ise on rohkem kapseldatud ja selle muutmine lõhub väiksema tõenäosusega koodi. Samas klassi välised funktsioonid on samuti ikkagi kasutamiseks mõeldud ja namespace tasandilt vaadates läheb kood täpselt sama moodi katki, kui nende funktsioonide päiseid muutma hakkad. Kokkuvõttes saad küll puhtama liidesega klassi, aga saadav kasu on üldises plaanis küsitav.
Oletame, et mul on objekt, millele tahan aega määrata.
void setTime_milliseconds(int t);
Nüüd kuna ma ei taha alati võibolla aega anda millisekundites teen sinna juurde loetavuse ja sisestamise lihtsustuse huvides nii nimetatud convenience funktsioone.
void setTime_seconds(int t);
void setTime_minutes(int t);
void setTime_hours(int t);
Nüüd kui koodis kirjutan "muutuja.setT", siis selle peale pakub IDE ise mulle juba kõik variandid välja.
Artikli soovituse järgi peaks funktsioonid sekunidite, minutite ja tundide jaoks viima klassist välja. Seega ma pean alati mäletama, mis oli põhiühik ning selle seadistamiseks kasutama otse klassi meetodit ja teiste jaoks otsima seda namespace'ist.
Ehk siis kaotan selle, et code completion muutub ebamugavamaks (mitte võimatuks, sest namespace nime kirjutamise peale viskab tõepoolest seal sees olevad funktsioonid lahti). Võidad mingi häguse tunde, et sul on nüüd puhas klass, kuid need abifunktsioonid on läbi namespace seotud ikkagi sama klassiga ja kasutad seda kompotti kui ühte klassi.
Võibolla kui kirjutada mingit üldkasutatavat librarit, siis oleks sellel mõtet. Et tõesti on üks minimaalse interfacega klass, ning selle ümber hulk abifunktsoonie, mida saab siis erinevate headerite vahel mingite loogiliste gruppidena ära jaotada.
|
|
Kommentaarid: 6 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
6 |
|
tagasi üles |
|
 |
|