» »

[C++] Metode

[C++] Metode

black ice ::

Imam program, v katerem prejmem celoštevilski vrednosti za nek objekt Točka. Napisati moram metodo, ki bo koordinate točke premaknila za nek procent. Kako naj vrnem tip double, če pa metoda prejme samo int? Najbolje bi bilo, da spremenim tip vnosa v double, vendar smo dobili tak primer in dvomim, da lahko spreminjamo že podano kodo.
Kakšna je razlika med funkcijami in metodami? Recimo v Javi so samo metode, kako je s tem v C++?

Še koda:
//tocka.h
class Tocka {
  private:
    int x, y;
  public:
    // privzeti konstruktor
    Tocka();
    // kopirni konstruktor
    Tocka(const Tocka& t);
    // pretvorbeni konstruktor
    Tocka(int xy);
    // konstruktor
    Tocka (int x1, int y1);
    // destruktor
    ~Tocka();
    // metode
    int getX();
    int getY();
    void print();
    double razdalja(Tocka t);
    void premakniProcent(double proc);
    void kvadrant();
};

//tocka.cpp
#include <iostream>
#include "tocka.h"
#include <cmath>

using namespace std;

Tocka::Tocka() :
		x(0), y(0) {
}

Tocka::Tocka(const Tocka& t) :
		x(t.x), y(t.y) {
}

Tocka::Tocka(int xy) :
		x(xy), y(xy) {
}

Tocka::Tocka(int x1, int y1) :
		x(x1), y(y1) {
}

Tocka::~Tocka() {
}

int Tocka::getX() {
	return x;
}

int Tocka::getY() {
	return y;
}

void Tocka::print() {
	cout << "(" << x << ", " << y << ") " << endl;
}

//double Tocka::razdalja(Tocka t) const {
double Tocka::razdalja(Tocka t) {
	//return sqrt((double)(this->x-t.x)*(x-t.x)+(y-t.y)*(y-t.y));
	return sqrt((double) (x - t.x) * (x - t.x) + (y - t.y) * (y - t.y));
}

void Tocka::premakniProcent(double proc) {
	
}

void Tocka::kvadrant() {
	if (x == 0 || y == 0) {
		cout << "tocka je na koordinatni osi" << endl;
	} else {
		if (x > 0) {
			if (y > 0) {
				cout << "1. kvadrant" << endl;
			} else {
				cout << "4. kvadrant" << endl;
			}
		} else {
			if (y > 0) {
				cout << "2. kvadrant" << endl;
			} else {
				cout << "3. kvadrant" << endl;
			}
		}
	}
}

//main.cpp
#include <cstdlib>
#include <iostream>
#include "tocka.h"

using namespace std;

int main(int argc, char *argv[])
{
    Tocka a;
    Tocka b(5);
    Tocka c(4,3);
    Tocka d(c);
    a.print();
    b.print();
    c.print();
    d.print();
    cout << a.razdalja(c) << endl;

    cout << "-----Dinamicna alokacija-----" << endl;
    Tocka* e = new Tocka;
    Tocka* f  = new Tocka(5);
    Tocka* g  = new Tocka(2,3);
    Tocka* h  = new Tocka(*g);
    (*e).print();
    f->print();
    g->print();
    h->print();
    delete e;
    delete f;
    delete g;
    delete h;

    return EXIT_SUCCESS;
}

BigWhale ::

Razlika med metodo in funkcijo je predvsem semanticna. Metoda funkcija, ki je deklarirana znotraj enega razreda.

Vse skupaj je pa isti smorn v bistvu. :)

Tako metode, kot funkcije lahko vracajo katero koli strukturo, odvisno od definicije.

int foo(int a, int b);

Tole vraca integer in prejme dva integer vhodna parametra.

double foo(int a, int b);

Tole pa vraca double.

MrBrdo ::

Tako zaradi popolnosti :) Metoda je v večini implementacij navadno funkcija, ki za prvi argument prikrito (brez da bi moral to eksplicitno napisati) prejme referenco na instanco razreda, na kateri to metodo kličeš. Tako da je tole praktično ekvivalentno:
instanca->metoda(parameter);
funkcija(instanca, parameter);

Razlika je predvsem v tem da ti compiler malo "pomaga", da lahko lepše in bolj berljivo zapišeš isto stvar. Ta instanca pa je pravzaprav struktura, ki vsebuje spremenljivke. Ali drugače povedano, razred je v bistvu struktura spremenljivk + funkcije, ki za prvi argument nujno prejmejo referenco na instanco razreda, ki jo kliče. Take funkcije pa imenujemo metode.
Aja no poleg tega imaš v razredu lahko še static metode, ki pa so pravzaprav čisto navadne funkcije, samo ime imajo namespacean z razredom (ImeRazreda::imeMetode()).
Pa še glede tvojega vprašanja, C++ omogoča tako funkcije kot metode, v Javi pa kot si že sam napisal imaš načeloma vedno metode.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

darkkk ::

glede same metode premakni_procent, dejmo samo privzet, da hočeš, da se vsaka koordinata množi s procentom.

pol maš:
Tocka::premakni_procent(double p){
   this->x = (int)p*(this->x);     //this je pointer na instanco razreda, ki kliče metodo
   y = (int)p*y;                  //ampak ne rabiš this pisat, je pa včasih bolj pregledno
}

Načeloma bi lahko mel kar funkcijo, ki bi dobila kot parametra referenco(ali pointer) na točko ter procent ter samo pošraufala točko. Glede samih računskih operacij, točka je načeloma piksel, uni cast je pa zato, k drugače zna compiler jokat.

black ice ::

Hvala vsem za obširne razlage. Bo potrebno napisati kar nekaj vrstic kode, da mi bo vse jasno. Prehod iz strukturiranega na objektno programiranje res ni od muh. :)

failcoder ::

Glede na to, da se gre za c++ aplikacijo bi bilo dobro, da ne mešaš c style cast in c++ style cast. V tvojem primeru bi skompajlana koda izgledala identično ne glede na to kak style uporabiš, vendar na prvem mestu se gre za to, da ta dva jezika čim manj mešaš med seboj in da pišeš kodo, ki je bolj blagodejna za oči in vzdrževanje.


Vredno ogleda ...

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

Java Objekti

Oddelek: Programiranje
102087 (1781) Mavrik
»

java minolovec

Oddelek: Programiranje
71422 (1273) xordie
»

programiranje C

Oddelek: Programiranje
62351 (2213) bozjak
»

[C++][Naloga]Točka, Daljica, Razdalja

Oddelek: Programiranje
91808 (1448) snow
»

c++ koordinatni sistem

Oddelek: Programiranje
172155 (1977) OwcA

Več podobnih tem