slvsnt Δημοσ. 18 Ιανουαρίου 2009 Δημοσ. 18 Ιανουαρίου 2009 έφτιαξα τον constructor της κλάσης ώστε να εισάγω δεδομένα μέσω αυτού στον πινάκα pin[10]. >#include<iostream> class ft { private: int code; int mls[12]; float cst[12]; public: ft(); }; main() { ft pin[10]; } έχετε να προτείνετε καμιά βελτίωση; >ft::ft() { cout<<"dwse dedomena"; cin>>code; for (int i=0;i<12;i++) cin>>mls[i]>>cst[i]; } Πως θα το κάνω όμως με τη δήλωση του πίνακα να αρχικοποιούνται οι τιμές (0) και μετά να τον καλώ ώστε να εισάγω τα δεδομένα; Είναι σωστό αυτό το κομμάτι(για την εισαγωγή που θέλω); > for (int i=0;i<10;i++) pin[i]=ft();
cyber_katsarida Δημοσ. 18 Ιανουαρίου 2009 Δημοσ. 18 Ιανουαρίου 2009 δεν κατάλαβα τι εννοείς. δε νομίζω να χρειάζεται πουθενά το new δε χρειάζεται εξάλλου να δεσμέυσει μνήμη πουθενά. με το που θα τρέξει το πρόγραμμα λόγω της δήλωσης του pin θα καλέσει τον constructor οπότε θα γεμίσει απο την αρχή ο πίνακας
slvsnt Δημοσ. 18 Ιανουαρίου 2009 Μέλος Δημοσ. 18 Ιανουαρίου 2009 ο constructor όμως δεν υποτίθεται ότι πρέπει να αρχικοποιεί τις τιμές; και επίσης είναι σωστός ο constructor.εννοώ μήπως δεν πρέπει να διβάζονται εκεί οι τιμές παρά να περνιούνται μόνο ώς όρισμα.
georgemarios Δημοσ. 18 Ιανουαρίου 2009 Δημοσ. 18 Ιανουαρίου 2009 γενικα, το να βαζεις τις τιμες ετσι στο constructor δεν ειναι πολυ καλο (αν και δουλευει). καλυτερα ειναι να τον κανεις > ft::ft() { // θετεις ολα τα μελη των πινακων στο 0 (ή κατι αλλο) memset(mls,0,sizeof(int)*12); memset(cst,0,sizeof(float)*12); } και μετα να εχεις μια συναρτηση που να κανει init τα δεδομενα, ωστε να την καλεσεις στο σημειο που νομιζεις πως ειναι καταλληλοτερο πχ > void ft::setArrayValues() { cout<<"dwse dedomena"; cin>>code; for (int i=0;i<12;i++) cin>>mls[i]>>cst[i]; } οποτε στη main σου θα πας καπως ετσι: > main(...) { ft pin[10]; // ως εδω εχεις αρχικοποιημενα ολα τα αντικειμενα σου με τα arrays τους να εχουν παντου την τιμη 0 // pare times apo to xristi for(int i=0; i<10; i++) pin[i].setArrayValues(); // ... kane pragmata edw me ta antikeimena sou...... // ksanapare (an xreiazetai) times apo to xristi for(int i=0; i<10; i++) pin[i].setArrayValues(); // pare times apo to xristi // kai paei legontas
3c0r1z Δημοσ. 20 Ιανουαρίου 2009 Δημοσ. 20 Ιανουαρίου 2009 >ft::ft() { cout<<"dwse dedomena"; cin>>code; for (int i=0;i<12;i++) cin>>mls[i]>>cst[i]; } Καλό είναι να μην χρησιμοποιείς συναρτήσεις στον constructor οι οποίες μπορούν να προκαλέσουν εξαιρέσεις μιας και το πρόγραμμα θα μπορεί να έχει απρόβλεπτη συμπεριφορά. Αν σου είναι χρήσιμο στο πρόγραμμα θα μπορούσες να χρησιμοποιείς Get και Set μεθοδους για κάθε μεταβλητή(οχι για πίνακες) αντι να έχεις μια μέθοδο που να δίνει τιμές σε όλες τις μεταβλητές, δηλαδή >int GetCode() const { return code; } void SetCode(int code_) {code = code_; } Επείσης δεν θα χρησιμοποιούσα πίνακες αλλά vector. Έτσι απλά δεν θα υπάρχει το πρόβλημα να αρχικοποιήσεις τις μεταβλητές όπως με τους πίνακες, απο την άλλη βέβαια δεν ξέρω αν γνωρίζεις να χρησιμοποιείς vectors ή αν επιτρέπετε(για άσκηση κλπ). Δηλαδή το πρόγραμα θα ήταν κάπως έτσι: >//pt.h: #ifndef PT_H_INCLUDED #define PT_H_INCLUDED #include <vector> #include <iostream> class pt { public: pt() : code(0) {} int GetCode() const { return code; } void SetCode(int code_) { code = code_; } void SetVecValues(int count); void PrintVec() const; void Init(); private: int code; std::vector<int> mls; std::vector<float> cls; }; void pt::SetVecValues(int count) { int tmpInt; float tmpFloat; std::cout << "dwse dedomena"; for(int i = 0; i != count; ++i) { std::cout << "\nAkeraioi: "; std::cin >> tmpInt; mls.push_back(tmpInt); std::cout << "\nPragmatikoi: "; std::cin >> tmpFloat; cls.push_back(tmpFloat); } } void pt::PrintVec() const { std::cout << "Akeraioi:\n"; for(int i = 0; i != mls.size(); ++i) std::cout << mls[i] << '\n'; std::cout << "Pragmatikoi:\n"; for(int i = 0; i != cls.size(); ++i) std::cout << cls[i] << '\n'; std::cout << std::endl; } #endif // PT_H_INCLUDED > //και main: #include "pt.h" int main() { pt test; int tmp; test.SetVecValues(3); std::cout << "allakse kwdiko:"; std::cin >> tmp; test.SetCode(tmp); std::cout << "\ncode: " << test.GetCode() << '\n'; test.PrintVec(); return 0; }
Evgenios1 Δημοσ. 20 Ιανουαρίου 2009 Δημοσ. 20 Ιανουαρίου 2009 ο constructor όμως δεν υποτίθεται ότι πρέπει να αρχικοποιεί τις τιμές;και επίσης είναι σωστός ο constructor.εννοώ μήπως δεν πρέπει να διβάζονται εκεί οι τιμές παρά να περνιούνται μόνο ώς όρισμα. Σωστος -----Προστέθηκε 20/1/2009 στις 10 : 18 : 46----- >ft::ft() { cout<<"dwse dedomena"; cin>>code; for (int i=0;i<12;i++) cin>>mls[i]>>cst[i]; } Αυτο ειναι βλακια "cin>>code" !!! Ποτε μη το κανεις αυτο,μεσα σε constructor. ΔΕΝ ειναι δυνατον να διμιουργισεις μια κλαση και αυτη να περιμενει IO. Πες πως εχεις ενα προγ το οποιο εχει 30 κλασεις, φαντασου να περιμενου ΙΟ οι 15 απο αυτες. Ζτοϊον! Ο cntr ειναι κατα καπιο τροπο η "main function" της κλασης. > myclass my=new myclass(); Το παραπανω διμιουργει τα αντικειμενα της κλασης και εκτελει τη > myclass::myclass(){} ή myclass::myclass(obj){} , myclass::myclass(obj,obj){} αναλογα τα overloads Κειτα ενα απλο παραδιγμα. Πες πως εχεις ενα ορθογωνιο (ως μια κλαση) > //cpp #include "StdAfx.h" #include "rect.h" ορθογωνιο::~ορθογωνιο(void) { } ορθογωνιο::ορθογωνιο(void) { this->Bottom=0; this->Left=0; this->Top=0; this->Right=0; } ορθογωνιο::ορθογωνιο(double τετραγωνο) { this->Bottom=τετραγωνο; this->Left=τετραγωνο; this->Top=τετραγωνο; this->Right=τετραγωνο; } ορθογωνιο::ορθογωνιο(double Top, double Left, double Bottom, double Right) { this->Bottom=Top; this->Left=Left; this->Top=Bottom; this->Right=Right; } //h #pragma once class ορθογωνιο { private: double Top; double Right; double Bottom; double Left; public: ορθογωνιο(void); ορθογωνιο(double tetrag); ορθογωνιο(double Top,double Left,double Bottom,double Right); ~ορθογωνιο(void); }; και εχει το προγ σου, με το οποιο θελεις ενα κυβο > main() { ορθογωνιο *obj=new ορθογωνιο(1.); } ?Θελω να σου πω οτι ,ο cntr ειναι για το Initialize (κατα περιπτοση)
slvsnt Δημοσ. 21 Ιανουαρίου 2009 Μέλος Δημοσ. 21 Ιανουαρίου 2009 παιδιά ευχαριστώ για τις απαντήσεις.έχω κάνει ένα πρόγραμμα και υποφέρει απο κάτι τέτοια λάθη. να κάνω και μια άλλη ερώτηση.έστω ότι θελήσω να βάλω και έναν έλεγχο εισαγωγής ώστε οι μεταβλητές να πέρνουν συγκεκριμένες τιμές. που θα προτείνατε να γίνεται ο έλεγχος;στη συνάρτηση >setArrayValues() ή να καλείται κάποια άλλη αποκλειστικά γι αυτή τη δουλειά;
3c0r1z Δημοσ. 25 Ιανουαρίου 2009 Δημοσ. 25 Ιανουαρίου 2009 Μια λύση είναι να χρησιμοποιείς μια συνάρτηση ας πούμε CheckInput() που θα κάνει τον έλεγχο πληκτρολόγησεις απο τον χρήστη. Τώρα πώς θα έλέγχεις την ορθότητα των δεδομένων είναι άλλο θέμα. Ένας τρόπος είναι να ελέγχεις τον τύπο επιστροφής της cin και πράττεις ανάλογα. Ένας άλλος είναι να αποθηκεύεις την είσοδο σε string και αν τα σύμβολα αντιστοιχούν σε ακέραιο ή πραγματικό να τα μετατρέπεις στον αντίστοιχο τύπο. Η επιλογή είναι δική σου.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.