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

C++ constructor


slvsnt

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

Δημοσ.

έφτιαξα τον 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();

Δημοσ.

δεν κατάλαβα τι εννοείς.

δε νομίζω να χρειάζεται πουθενά το new

δε χρειάζεται εξάλλου να δεσμέυσει μνήμη πουθενά.

με το που θα τρέξει το πρόγραμμα λόγω της δήλωσης του pin θα καλέσει τον constructor οπότε θα γεμίσει απο την αρχή ο πίνακας

Δημοσ.

ο constructor όμως δεν υποτίθεται ότι πρέπει να αρχικοποιεί τις τιμές;

και επίσης είναι σωστός ο constructor.εννοώ μήπως δεν πρέπει να διβάζονται εκεί οι τιμές παρά να περνιούνται μόνο ώς όρισμα.

Δημοσ.

γενικα, το να βαζεις τις τιμες ετσι στο 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

Δημοσ.

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

Δημοσ.
ο constructor όμως δεν υποτίθεται ότι πρέπει να αρχικοποιεί τις τιμές;

και επίσης είναι σωστός ο constructor.εννοώ μήπως δεν πρέπει να διβάζονται εκεί οι τιμές παρά να περνιούνται μόνο ώς όρισμα.

 

Σωστος :shifty:

 

 

-----Προστέθηκε 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 (κατα περιπτοση)

Δημοσ.

παιδιά ευχαριστώ για τις απαντήσεις.έχω κάνει ένα πρόγραμμα και υποφέρει απο κάτι τέτοια λάθη.

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

>setArrayValues()

ή να καλείται κάποια άλλη αποκλειστικά γι αυτή τη δουλειά;

Δημοσ.

Μια λύση είναι να χρησιμοποιείς μια συνάρτηση ας πούμε CheckInput() που θα κάνει τον έλεγχο πληκτρολόγησεις απο τον χρήστη. Τώρα πώς θα έλέγχεις την ορθότητα των δεδομένων είναι άλλο θέμα. Ένας τρόπος είναι να ελέγχεις τον τύπο επιστροφής της cin και πράττεις ανάλογα. Ένας άλλος είναι να αποθηκεύεις την είσοδο σε string και αν τα σύμβολα αντιστοιχούν σε ακέραιο ή πραγματικό να τα μετατρέπεις στον αντίστοιχο τύπο. Η επιλογή είναι δική σου.

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

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

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