» »

[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:

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 ->

metalc ::

Kot prvo, manjka ti deklaracija razreda Mesto.

Ciklamen ::

Imam vse deklarirano, samo nisem vsega skopiral ker sem mnenja da tisto ni pomembno za moj problem :)

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.

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

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
- End of the Post ->

black ice ::

Ciklamen je izjavil:


Ima kdo idejo, kako naj se lotim, da dobim podatke uporabnika, kateri dve mesti želi primerjati?

Zahtevaš vnos imen teh dveh mest.
Programiranje II slučajno?

Ciklamen ::

Ja, Programiranje II ^^
- End of the Post ->


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Potrebujem javascript pomoč

Oddelek: Programiranje
81221 (971) no1pheeew
»

Še v odmevih na teroristično dejanje v Oslu

Oddelek: Novice / NWO
119270 (4458) slo81
»

C++ pomoč

Oddelek: Programiranje
5880 (810) Tutankhamun
»

Namestitevena delavnica Linuxa

Oddelek: Novice / Ostala programska oprema
72661 (2323) PingoUser
»

Hlajenje bartona

Oddelek: Hlajenje in modifikacije
6847 (797) boštjan

Več podobnih tem