Απορίες με αντικειμενοστραφή προγρ

Συζητήσεις για την γλώσσα C και C++

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
pcbmaker1985
Δημοσιεύσεις: 1
Εγγραφή: 27 Μάιος 2012 20:52

Απορίες με αντικειμενοστραφή προγρ

Δημοσίευση από pcbmaker1985 » 27 Μάιος 2012 21:06

Καλησπέρα σε όλους
Είμαι νέος στον προγραμματισμό σε C++
Εχω μελετήσει τα βασικά αλλά έχω μερικές απορίες τις οποίες πρέπει να λύσω για να επιλύσω μια εργασία

Το πρόβλημα μου είναι το ότι δεν μπορώ να καταλάβω πότε πρέπει να χρησιμοποιώ constructors,set get και γενικά πως δομείται μια κλάση και που χρησιμεύει(όπως επίσης και ποιά η διαφορά του constructor με τις μεθόδους set get)

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

Το πρόβλημα μου είναι το ότι όπως προ είπα δεν καταλαβαίνω πως και γιατί να χρησιμοποιήσω set get μεθόδους και constructors

Ελπίζω να μπορεί κάποιος να με βοηθήσει όσων αφορά τις απορίες μου
Δεν θέλω να μου λύσει κάποιος την άσκηση απλά να καταλάβω για να προχωρήσω παρακάτω


Ευχαριστώ πολύ

Άβαταρ μέλους
xmavidis
Honorary Member
Δημοσιεύσεις: 1217
Εγγραφή: 02 Δεκ 2003 19:59
Τοποθεσία: Ηράκλειο

Απορίες με αντικειμενοστραφή προγρ

Δημοσίευση από xmavidis » 28 Μάιος 2012 12:08

Τον constructor μιας κλάσσης τον χρησιμοποιείς για να περάσεις αρχικά δεδομένα από το πρόγραμμα στην κλάσση.
Για παράδειγμα, αν για τον υπολογισμό απαιτείται η τιμή της τάσης πρέπει να την περάσεις με τον constructor.
Ο κάθε constructor "τρέχει" μόλις ορίζεις ένα αντικείμενο στο πρόγραμμα σου. Πχ, αν η κλάσση ονομάζεται Resistance

Κώδικας: Επιλογή όλων

voltage = 4.0;
Resistance r (voltage);
Την ίδια διαδικασία μπορείς να την κάνεις και με μια set method (αν δεν χρησιμοποιήσεις constructor) αλλά πρέπει να την καλέσεις πριν καλέσεις οποιαδήποτε μέθοδο που κάνει υπολογισμούς.

Κώδικας: Επιλογή όλων

voltage = 4.0;
Resistance r;
r.setVoltage(voltage);
Αν η τάση τώρα αλλάζει κατά την διάρκεια εκτέλεσης μιας μεθόδου τότε μπορείς να χρησιμοποιήσεις μια get method για να πάρεις την νέα τιμή την τάσης ή όποιου άλλου μεγέθους θέλεις και μπορείς να υπολογίσεις μέσα από την κλάσση.

Κώδικας: Επιλογή όλων

voltage = 4.0;
Resistance r(voltage);
r.CalculateSomething();
std&#58;&#58;cout << "New voltage &#58; " << r.getVoltage&#40;&#41; << std&#58;&#58;endl;
I want to know God’s thoughts; the rest are details.
Albert Einstein

PanosPss
Δημοσιεύσεις: 78
Εγγραφή: 10 Μάιος 2008 19:53

Απορίες με αντικειμενοστραφή προγρ

Δημοσίευση από PanosPss » 27 Ιούλ 2012 20:03

Γεια σου φιλαράκι!

Και εγώ νέος στην C++ θα στα πώ έτσι όπως τα έχω καταλάβει!

Η κλάση αντιπρωσοπεύει ένα αντικείμενο του πραγματικού κόσμου. Δηλάδη με απλά λόγια φαντάσου ένα βιβλίο που διαβάζεις. Αυτό για τα το περάσεις στον υπολογιστή γίνεται μέσω μιας κλάση. πχ

Κώδικας: Επιλογή όλων

#ifndef BOOK_H_
#define BOOK_H_

class Book &#123;
public&#58;
	Book&#40;&#41;;
        Book&#40;int, int, int&#41;;
	virtual ~Book&#40;&#41;;
private&#58;
	int upso;
        int platos;
        int selides;
        κτλ... &#40;πληροφορίες σχετικά με το βιβλίο&#41;
&#125;;

#endif /* BOOK_H_ */
στο public βάζουμε τις μεθόδους δηλ. το τι μπορεί να κάνει το βιβλίο (αυτό είναι μέθοδος)
ενώ στο private ή protected (εγώ προσωπικα χρησιμοποιώ το private για λόγους ασφαλείας) βάζουμε τις μεταβλητές (αυτά που προσδιορίζουν το βιβλίο)

Τώρα αν θέλουμε να αποθηκεύσουμε δεδομένα στις μεταβλητές ή να επιστρέψουμε δεδομένα από τις μεταβλητές μας, χρησιμοποιούμε getter και setters (εγώ προσωπικά τα ονομάζω save και show) και αυτά είναι μέθοδοι (άρα γράφονται στο public) και μας δίνουν πρόσβαση στις μεταβλητές για να κάνουμε αποθηκεύσουμε/επιστρέψουμε δεδομένα γιατί μην ξεχνάς ότι οι μεταβλητές μας είναι στο private και δεν έχουμε πρόσβαση άρα με κάποιο τρόπο θα πρέπει να αποκτήσουμε πρόσβαση!

Ας πάμε και στον constructor. Constructor = δημιουργός (αντικειμένου)... με απλά λόγια δεσμένει μνήμη για το αντικείμενο. Υπάρχουν 2 είδη constructor. Ένας αυτός που δημιουργεί αυτόματα ο compiler και ο άλλος που τον γράφεις εσύ.

ΠΧ.

Κώδικας: Επιλογή όλων

#ifndef BOOK_H_
#define BOOK_H_

class Book &#123;
public&#58;
	Book&#40;&#41;;
        Book&#40;int, int, int&#41;;
	virtual ~Book&#40;&#41;;
private&#58;
	int upso;
        int platos;
        int selides;
        κτλ... &#40;πληροφορίες σχετικά με το βιβλίο&#41;
&#125;;

#endif /* BOOK_H_ */
Στο παραπάνω το Book() είναι αυτός που δημιουργεί αυτόματα το eclipse, ενώ το Book(int, int, int) είναι αυτό που γράφω εγώ την υλοποιησή του στο .cpp και όταν το καλώ θα δεσμέυσει μνήμη τόση όση αντιστιχεί στα 3 int που έχω μεσα στις παρενθεσεις!

Αυτά ενολίγης... αν στα έλαγα φυσικα θα ήταν πιο κατανοητά γιατι στο γραψιμο δεν τα πάω και πολύ καλα... αλλα ελπίζω να τα καταλάβεις έτσι όπως τα έγραψα!!![/code]

nkast
Δημοσιεύσεις: 137
Εγγραφή: 15 Νοέμ 2009 20:31
Επικοινωνία:

Απορίες με αντικειμενοστραφή προγρ

Δημοσίευση από nkast » 29 Ιούλ 2012 03:26

Στην περίπτωση μιας αντίστασης για παράδειγμα, πιστεύω πως ο constructor θα πρέπει να απαιτεί την τιμή τις αντίστασης σαν όρισμα.

Resistance.h

Κώδικας: Επιλογή όλων

class Resistance
&#123;
private&#58;
	int _value; // ohm

public&#58;
	//Resistance&#40;void&#41;; //shouldn't create a resistance with unkown value
	Resistance&#40;int value&#41;;
	~Resistance&#40;void&#41;;
&#125;;
Resistance.cpp

Κώδικας: Επιλογή όλων

Resistance&#58;&#58;Resistance&#40;int value&#41;
&#123;
	_value = value;
&#125;

Resistance&#58;&#58;~Resistance&#40;void&#41;
&#123;
&#125;
Στο προγραμμα σου:

Κώδικας: Επιλογή όλων

	//you have to specify a value during creation
	Resistance resistanceB&#40;10&#41;; 

	// you can't do that!
	//Resistance resistanceA&#40;&#41;; 

Ξαναλέω πως η τιμη της αντιστασης θα πρεπει να οριζεται κατα την δημιουργία και να μην αλλαζει αργοτερα. Επομενος μπορεις να φτιαξεις μια int GetValue() αλλα θα ηταν λάθος να προσφέρει μια SetValue(int newValue) ή να κανεις την _value public.

Me to παραπανω σχήμα, δηλαδή:
(1)constructor with parameter,
(2) private _value,
(3) GetValue()
εξασφαλίζεις πως η αντίσταση θα εχει παντα καποια τιμή με νοημα, δεν θα επιτρέπετε να αλλάζει τιμή στην πορεία, ενω παράλληλα μπορείς να διαβάσεις την τιμη της αντίστασης με την GetResistance().



*extra points*
Αν χρειαστεί σε καποιες περιπτώσεις να αλλαζει η τιμη μιας αντίστασης κατα το simulation, Τοτε δεν μιλαμε για αντισταση αλλα για τριμμερ. Το σωστό θα είναι να φτιάξεις μια νεα κλασσή Trimmer που θα κληρονομεί την κλάσση Resistance, θα παίρνει σαν ορίσματα επιπλέον τιμες minValue,maxValue και θα ελέγχει για ορθότητα την νεα τιμή κατα το SetValue(int new value).

Απάντηση

Επιστροφή στο “C, C++”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες