Forum » Programiranje » [C++] Polje objektov
[C++] Polje objektov
Ciklamen ::
Pozdrav.
Spet se jaz javljam, sedaj me zanima kako naj poštimam polje objektov, da bi vsaj delovalo? :D
Torej v headerju imam:
v mainu:
Upam da je razumljivo, kaj bi rad dosegel. Vsaka pomoč bo še kako dobrodošla :)
Spet se jaz javljam, sedaj me zanima kako naj poštimam polje objektov, da bi vsaj delovalo? :D
Torej v headerju imam:
Mesto::Mesto(int x, int y, std::string mesto) : koorX(x), koorY(y), imeMesta(mesto) { } metoda izpis: void Mesto::izpis() { cout<<"Mesto: "<<imeMesta<<'\n'; cout<<"Koordinate mesta: X:"<<koorX<<" Y:"<<koorY<<'\n'; }
v mainu:
int main(){ Mesto* m[100]; potem imam tu switch: case 1: uporabnik vpiše koordinate in ime mesta m[i]=new Mesto(x, y, imeMesto); i++; case 2: tu bi rad, da poberem 2 mesti iz polja in ju primerjam case 3: tu bi rad izpis mest in koordinat, imam v headerju metodo izpis(); }
Upam da je razumljivo, kaj bi rad dosegel. Vsaka pomoč bo še kako dobrodošla :)
- End of the Post ->
Ciklamen ::
Imam vse deklarirano, samo nisem vsega skopiral ker sem mnenja da tisto ni pomembno za moj problem :)
Header fajl:
in še cpp fajl:
Header fajl:
class Mesto { private: int koorX, koorY; std::string imeMesta; public: Mesto();//privzeti konstruktor ~Mesto(); Mesto(const Mesto& m); //kopirni konstruktor Mesto(int xy); //pretvorbeni konstruktor Mesto(int x, int y, std::string mesto); //konstruktor int getX(); void setX(int x1); void setIme(std::string ime); std::string getIme(); void setY(int y1); int getY(); void izpis(); double razdalja(Mesto m, Mesto n); };
in še cpp fajl:
Mesto::Mesto() : koorX(0),koorY(0),imeMesta("") { } Mesto::Mesto(const Mesto& m) : koorX(m.koorX), koorY(m.koorY), imeMesta(m.imeMesta) { } Mesto::Mesto(int xy) : koorX(xy), koorY(xy) { } Mesto::Mesto(int x, int y, std::string mesto) : koorX(x), koorY(y), imeMesta(mesto) { } Mesto::~Mesto(){ } int Mesto::getX() { return koorX; } void Mesto::setX(int x1) { koorX=x1; } int Mesto::getY() { return koorY; } void Mesto::setY(int y1) { koorY=y1; } std::string Mesto::getIme() { return imeMesta; } void Mesto::setIme(std::string ime) { imeMesta=ime; } void Mesto::izpis() { cout<<"Mesto: "<<imeMesta<<'\n'; cout<<"Koordinate mesta: X:"<<koorX<<" Y:"<<koorY<<'\n'; } double Mesto::razdalja(Mesto m, Mesto n) { return sqrt((double)(n.koorX - m.koorX)*(n.koorX - m.koorX)+(n.koorY - m.koorY)*(n.koorY - m.koorY)); }
- End of the Post ->
metalc ::
Najprej še ena opazka. Znotraj switcha moraš na koncu vsakega case dodati še break. Ne da bi to bilo obvezno, ampak če ga ni, se stvar nadaljuje v naslednjem case itd., dokler ne naleti na prvi break ali konec switcha.
Podobno kot za string moraš tudi za cout spredaj pripeti še std:: razen če nekje na začetku ne napišeš "using namespace std"
Kaj bi pod 2 rad primerjal? Imeni mest po abecedi ali katero leži npr. severneje? Nekako moraš tudi dobiti številki obeh mest, ki ju želiš primerjati. Pa še tu moraš paziti, da ne padeš izven območja, da katerikoli kazalec ni null (če ga poskušaš dereferencirati, se ti program sesuje) itd...
Pod 1 lahko dodaš še preverjanje, da je new dejansko uspel alocirati pomnilnik za mesto (če ga ni, vrne null)
Pod 3 bi moralo biti trivialno, če seveda poznaš število vseh mest. j.to mesto dosežeš z m[j]->neka_javna_metoda() oz. grše (*m[j]).neka_javna_metoda()
Na koncu programa (če ne prej) se načeloma z "delete" počisti vse, kar si zasegel z new. Že zaradi lepega stila če ne tudi zaradi memory leakov. Še bolje pa, če namesto polja uporabiš std::vector ali std::list ipd., ki ti nudijo dosti več fleksibilnosti.
Podobno kot za string moraš tudi za cout spredaj pripeti še std:: razen če nekje na začetku ne napišeš "using namespace std"
Kaj bi pod 2 rad primerjal? Imeni mest po abecedi ali katero leži npr. severneje? Nekako moraš tudi dobiti številki obeh mest, ki ju želiš primerjati. Pa še tu moraš paziti, da ne padeš izven območja, da katerikoli kazalec ni null (če ga poskušaš dereferencirati, se ti program sesuje) itd...
Pod 1 lahko dodaš še preverjanje, da je new dejansko uspel alocirati pomnilnik za mesto (če ga ni, vrne null)
Pod 3 bi moralo biti trivialno, če seveda poznaš število vseh mest. j.to mesto dosežeš z m[j]->neka_javna_metoda() oz. grše (*m[j]).neka_javna_metoda()
Na koncu programa (če ne prej) se načeloma z "delete" počisti vse, kar si zasegel z new. Že zaradi lepega stila če ne tudi zaradi memory leakov. Še bolje pa, če namesto polja uporabiš std::vector ali std::list ipd., ki ti nudijo dosti več fleksibilnosti.
metalc ::
Aja, pri razdalji bi najverjetneje bilo dovolj, da daš kot argument le eno mesto in ti bo izračunal razdaljo med tem in podanim mestom (člane "tega" razreda dosežeš z this->...). Npr. ljubljana.razdalja(maribor). In kot argument vsekakor raje podaj konstantno referenco, da bo manj overheada s kreiranjem kopij objekta. Npr.
Mesto::razdalja(const Mesto& m) {...}
Če že misliš pustiti tako kot imaš, ima metoda smisel, če je statična.
tisti (double) v Pitagorovem izreku je sicer čisto OK, vendar nekako velja za "oh so C-ish". Za bolj ce-plus-plusovsko se uporabi static_cast
Mesto::razdalja(const Mesto& m) {...}
Če že misliš pustiti tako kot imaš, ima metoda smisel, če je statična.
tisti (double) v Pitagorovem izreku je sicer čisto OK, vendar nekako velja za "oh so C-ish". Za bolj ce-plus-plusovsko se uporabi static_cast
Ciklamen ::
OK torej uspelo mi je sprintat zadevo, malo sem failal, ker sem statično namesto dinamično alociranje uporabljal :D
Ima kdo idejo, kako naj se lotim, da dobim podatke uporabnika, kateri dve mesti želi primerjati?
Navodilo naloge je: Funkcijo, ki dobi na vhodu dve mesti, vrne pa razdaljo med mestoma.
Naloga je za študij, ni to naloga za osebni gušt ^^
metalc, v vsakem case-u imam break, tista koda zgoraj ni dejanska koda, pač pa oris kaj sem želel doseči ^^ Sem toliko "podučen" da vem, kaj potrebujem v switch stavkih, ampak vseeno hvala za skrb, vsekakor preveriti ni odveč :D
Ima kdo idejo, kako naj se lotim, da dobim podatke uporabnika, kateri dve mesti želi primerjati?
Navodilo naloge je: Funkcijo, ki dobi na vhodu dve mesti, vrne pa razdaljo med mestoma.
Naloga je za študij, ni to naloga za osebni gušt ^^
metalc, v vsakem case-u imam break, tista koda zgoraj ni dejanska koda, pač pa oris kaj sem želel doseči ^^ Sem toliko "podučen" da vem, kaj potrebujem v switch stavkih, ampak vseeno hvala za skrb, vsekakor preveriti ni odveč :D
- End of the Post ->
black ice ::
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | Potrebujem javascript pomočOddelek: Programiranje | 1221 (971) | no1pheeew |
» | Še v odmevih na teroristično dejanje v OsluOddelek: Novice / NWO | 9270 (4458) | slo81 |
» | C++ pomočOddelek: Programiranje | 880 (810) | Tutankhamun |
» | Namestitevena delavnica LinuxaOddelek: Novice / Ostala programska oprema | 2661 (2323) | PingoUser |
» | Hlajenje bartonaOddelek: Hlajenje in modifikacije | 847 (797) | boštjan |