Προς το περιεχόμενο

c++ erwthsh


dekra

Προτεινόμενες αναρτήσεις

Δημοσ.

xairetw...

 

as poume pws exw mia klassh en onomati "sxhma" i opoia anamesa sta alla exei kai mia synarthsh "draw" i opoia analoga me tis parametrous pou 8a parei, dhmiourgei kai kapoio diaforetiko sxhma (kyklos, trigwno klp).

 

to provlima mou einai oti dyo diafretika sxhmata tyxainei na exoun tis idies parametrous me apotelesma se afth thn periptwsh na mhn pianei o polymorfismos opws prin. dld idio onoma synarthshs me diaforetikes parametrous vgazei diaforetiko sxhma.

 

ti 8a borousa na kanw etsi wste me idies parametrous kai idio onoma synarthshs na vgazei ta dyo afta diaforetika sxhmata ???

 

elpizw na egina katanohtos...

 

thnx!!

Δημοσ.

Απλό. Η C++ επιτρέπει function overloading οπότε το μόνο που έχεις να κάνεις είναι να φτιάξεις την ίδια function με διαφορετικές παραμέτρους και ο compiler θα καταλάβει από μόνος του ποιά θα χρειαστεί να καλέσει ανάλογα με αυτό που θα της περάσεις ως παράμετρο. Διάβασε γενικά για function overloading και θα καταλάβεις. Αμα πχ έχεις μια function που λεγεται myFunction και θες να κάνει διαφορετικά πράγματα για κάποιον int και διαφορετικά για κάποιον float το μόνο που κάνεις είναι

 

>
//Call this if the parameter is int
myFunction(int a)
{
   ......
}

//Call this if the parameter is float
myFunction(float a)
{
    ......
}

 

Δεν είμαι σίγουρος όμως για κάτι. Για το τι ακριβώς περνάς και άμα ο χρήστης ξέρει από πριν τι σχήμα θα είναι. Αμα το ξέρει το σχήμα θα μπορούσες απλά ως παράμετρο να περάσεις ένα string και να ξέρει η function τι θα ζωγραφίσει συγκρίνοντάς το απλά μέσα σε ένα if case. Χρησιμοποίησε το strcmp() για να το κάνεις αυτό.

 

Οπως καταλαβαίνεις υπάρχουν αρκετοί τρόποι απλά διαλέγεις και πέρνεις μιας και δεν γνωρίζω ακρίβως το προγραμμά σου.

Δημοσ.
Απλό. Η C++ επιτρέπει function overloading οπότε το μόνο που έχεις να κάνεις είναι να φτιάξεις την ίδια function με διαφορετικές παραμέτρους και ο compiler θα καταλάβει από μόνος του ποιά θα χρειαστεί να καλέσει ανάλογα με αυτό που θα της περάσεις ως παράμετρο. Διάβασε γενικά για function overloading και θα καταλάβεις. Αμα πχ έχεις μια function που λεγεται myFunction και θες να κάνει διαφορετικά πράγματα για κάποιον int και διαφορετικά για κάποιον float το μόνο που κάνεις είναι

 

>
//Call this if the parameter is int
myFunction(int a)
{
   ......
}

//Call this if the parameter is float
myFunction(float a)
{
    ......
}

 

Δεν είμαι σίγουρος όμως για κάτι. Για το τι ακριβώς περνάς και άμα ο χρήστης ξέρει από πριν τι σχήμα θα είναι. Αμα το ξέρει το σχήμα θα μπορούσες απλά ως παράμετρο να περάσεις ένα string και να ξέρει η function τι θα ζωγραφίσει συγκρίνοντάς το απλά μέσα σε ένα if case. Χρησιμοποίησε το strcmp() για να το κάνεις αυτό.

 

Οπως καταλαβαίνεις υπάρχουν αρκετοί τρόποι απλά διαλέγεις και πέρνεις μιας και δεν γνωρίζω ακρίβως το προγραμμά σου.

 

Τέτοιες κλάσεις ειναι το κλασικό παράδειγμα αντικειμενοστρεφούς προγραμματισμου που βρίσκεις σε όλα τα βιβλία προγραμματισμού για OO.

 

Αντι να έχεις μια συνάρτηση για κάθε σχημα και να περνάς παραμέτρους, μπορεις να φτιάξεις μια κλάση για κάθε σχήμα, που θα κληρονομεί την βασική κλάση Shape. Π.χ

>

class MyPoint 
{
float x;
float y;
}

class Shape
{
public : 
int penColor;  //pen attributes
int penType;

int brushColor; //brush attributes
int brushType; 

vector<MyPoint> Points; //X,Y coordinates of the shape

void Shape(); //ctor

virtual void Draw()=0; //abstract class

void ~Shape(); //dctor
}

class Line : public Shape
{

void Line(MyPoint a,MyPoint b);
virtual void Draw(); 
}

void Line::Line(MyPoint a,MyPoint b)
{
//add points to point array ....
//....
}

void Line::Draw()
{
//do the drawling
}

class Triangle : public Shape
{
public:
void Triangle(MyPoint a, MyPoint b, MyPoint c);
void Draw();
}

void Triangle::Triangle(MyPoint a,MyPoint b, MyPoint c)
{
//add points to array
MyPoints.push_back(a);
MyPoints.push_back(b);
MyPoints.push_back(c);
}

void Triangle::Draw()
{
//do the drawing
}

 

Οποτε μετα μπορεις να τα χρησιμοποιήσεις πολύ εύκολα, και χωρίς χρειάζεται να ξέρεις τι ειναι αυτο που κάνεις paint

 

δηλαδή :

>

((Shape *)MyShapes[2])->Draw();

 

Αν υποθέσουμε οτι το MyShapes ειναι ένας vector με shapes.

Ο παραπάνω κώδικας ειναι ενδεικτικός μόνος, όλα μπορούν να γίνουν καλύτερα, αλλα ελπίζω να σου έδωσα μια ιδέα.

Δημοσ.

nai to function overloading to exw ypopsin, to 8ema einai oti sth sygkekrimenh periptwsh ta dyo ayta sxhmata exoun tis idies akrivws parametrous kai se adistoixia einai tou idiou typou. opote an i synarthsh draw tis perasw aftes tis parametrous den 8a kserei an einai to ena i to allo.

 

px

sxhma 1 - parametroi(float, float, float)

sxhma 2 - parametroi(float, float, float)

 

an twra kalesw

 

draw(float, float, float)

 

epeidh einai idio to signature den 8a kserei poio apo ta dyo 8a ftiaxei.

opote den einai 8ema overloading edw.

 

Pera apo to na pernaw mia akomh parametro me to onoma klp klp...

rwtaw an yparxei kanenas poio eksypnos tropos h poio swstos an 8elete gia na ly8ei ayto..

 

shmeiwsh:

 

ta stoixeia gia ka8e sxhma ta diavazw apo ena arxeio opote kserw ti sxhma einai otan to diavasw. to shape object pou 8a ftiaxtei den to kserei. ypoti8etai oti anloga me tis parametrous 8a to anagnwrizei.

 

episis logw specification i klassh pou kanei ta sxhmata einai mia. den yparxei ieraxikh domh me inheritance klp. dld genikh klassh shape kai meta px allh klassh kyklos pou pairnei kapoia apo ta stoixeia ths shape. kati sna to paradeigma dld tou filou bandito.

 

 

enas tropos pou skeftika einai na diaforwpoihsw to signature tou enos sxhmatos metatrepodas to se double wste na trexei h analogh draw kai meta se float pali.

 

apla psaxnw gia enallaktikes lyseis :)

 

 

efxaristw gia tis apadiseis sas paides!!

 

 

PS: parepiptodws file bandito ekei pou les

 

((Shape *)MyShapes[2])->Draw();

 

efoson i draw den exei parametrous pws kserei an 8a kanei draw ena triangle i kati allo symfwna me ton ypoloipo kwdika?

Δημοσ.

1. Θα γράψεις τις συναρτήσεις για την σχεδίαση κύκλου , τετραγώνου κτλ π.χ. DrawLine DrawCircle κτλ.

2.Μέσα στην τάξη σου θα δηλώσεις ένα δημόσιο δείκτη σε συνάρτηση που θα ονομάζεται draw και θα παίρνει τις ίδιες ακρβώς παραμέτρους με τις DrawLine και DrawCircle.

3.Μετά κάθε φορά που θέλεις να τυπώσεις μία γραμμή για ένα αντικείμενο της τάξης που ονομάζεται obj θα κάνεις αυτή την ανάθεση obj->draw = &DrawLine (δηλαδή θα θέτεις τον δείκτη στην αντίστοιχη συνάρτηση ) . Αν η αρχική συνάρτηση είναι της μορφής void DrawLine (float,float,float). Τότε για να τυπώσεις μία γραμμή για το αντικείμενο obj με παραμέτρους 2.3 3.5 5.6 θα καλέσεις : obj->draw(2.3,3.5,5.6).

 

Ελπίζω να σε βοήθησα....

Δημοσ.

 

PS: parepiptodws file bandito ekei pou les

 

((Shape *)MyShapes[2])->Draw();

 

efoson i draw den exei parametrous pws kserei an 8a kanei draw ena triangle i kati allo symfwna me ton ypoloipo kwdika?

 

Για την ιστορία , θα σου πώ οτι εσύ μπορει να μην το ξέρεις, αλλα η κλάση το ξέρει. Κάπου θα έχει γίνει ένα instance ώς εξής:

 

>

Triangle * aTriangle = new Triangle(MyPoint1,MyPoin2,MyPoint3)
aTriangle->Draw()

 

Αν λές οτι ξέρεις τι σχήμα ειναι κάθε φορά ακόμα το καλύτερο.

Και φυσικά η κλάση που διαβάζει το αρχείο η που κάνει όλες τις δουλειές τελος πάντων μπορει να ειναι μια.

Κάθε φορά που θα διαβάζεις ένα σχήμα , θα φτιάχνεις ένα καινούργιο instance , θα το βάζεις να ζωγραφίζει τον εαυτό του και τέλος.

 

Αν έφτιαχνες μια εφαρμογή που ήθελε redraw, θα ξαναδιάβαζες το αρχείο απο την αρχή? Αν έπρεπε ένα σχήμα να ΜΗΝ το ζωγραφίσεις , πώς θα το καταλάβαινες και πώς θα το έκανες κώδικα αυτο? (ενω αν στην κλάση shape έχεις ενα bool DoDraw, και το κανεις false, η Draw απλώς δεν θα κάνει τιποτα).

 

Τέσπα, γούστα είπεν ο πίθηκος και έφαγε το σαπούνι.

 

Υ.Γ. Πρώτη φορά ακούω specification που υπαγορεύει να κάνεις κωλοτούμπες και αλχημείες για να κάνεις κάτι πολύ απλό,κατι για το οποίο μάλιστα ειδικά, φτιαχτηκε η c++. Σαν να σου έλεγα γράψε java, αλλα απαγορευεται να χρησιμοποιήσεις τον garbage collector.

Είπαμε, είπαμε. Γούστα είπεν ο πίθηκος....

Δημοσ.
oxi edaxei' date=' o bandito mia xara ta e3hghse.

 

by the way to vitsio gia to pws 8a ginei einai allounou kai oxi diko. opote katalavaineis...[/quote']

 

Aaaaaaaa, πες οτι ειναι άλλος ο μαζόχας!!!!

 

Δεν έχει σημασία αν το έκανα πολύπλοκο η οχι. Σημασία έχει να μάθεις να γράφεις σωστά. Αν έχεις μάθει απο την αρχή στον εύκολο τρόπο της τσαπατσουλιάς γιατι έτσι βγαίνει γρήγορα, αν ποτέ πέσεις στα βαθιά , θα πνιγείς for sure.

 

Ο κακός κώδικας ειναι σαν την ραδιενέργεια. Δεν τον καταλαβαίνεις αλλα σου κάνει κακό. Εκτός αν πληρώνεσαι , τότε αλλάζει το πράγμα ;)

Δημοσ.

Καλά ναι σίγουρα , απλά το συγκεκριμένο δεν νομίζω ότι χρειαζόταν να τραβηχτεί έτσι! Τελος πάντων, επιστρέφω στο πρωινό μου

Δημοσ.

to kserw oti apantaw ligo arga....alla exeis akousta apo virtual functions? to provlima sou einai to klassikotato pou mporei na tixei....psaxe sto google gia ti esti virtual functions kai tha kaneis ti douleia sou aneta.......

 

prosoxi.....an katalava kala xrisimopoieis inheritance opote prepei na koitakseis kai gia virtual destructors giati alliws tha trexeis kai de tha ksereis giati.....

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...