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

Τελεστής new στην C++


aris92

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

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

Να και ο κώδικα:

Shape join(Shape obj1,Shape obj2)

{

obj3 = new Shape [rtrn(obj1)+rtrn(obj2)];//rtrn(obj1),rtrn(obj2) φίλιες συναρτήσεις της κλάσης Shape

for(int i=0;i<rtrn(obj1);i++)

{

obj3=rtrpin(obj1,i);// rtrpin(obj1,i) φίλιας συναρτήση της κλάσης Shape

}

for(int j=0;j<rtrn(obj2);j++)

{

obj3[j+rtr(obj1)]=rtrpin(obj2,j);

}

return *obj3;

}

μου χτυπάει μήνυμα

obj3 undeclared (first use this function)

Να πω για να καταλάβετε ότι η συνάρτηση Shape join(Shape obj1,Shape obj2) παίρνει σαν παραμέτρους δύο

αντικείμενα κλάσης Shape, και επιστρέφει ένα αντικείμενο κλάσης Shape το

οποίο αποτελείται από όλα τα σημεία και των δύο αντικειμένων

Επίσης στις υποδείξεις μου λέει να χρησιμοποιήσω copy contructors αλλά εγώ δεν τους έχω χρησιμοποιήσει πουθενά.

Πείτε μου αν σας βοηθάει να σας δώσω και όλο τον κώδικα του προγράμματος

thnks anyway!

 

έκανα λάθος στο copy-paste το σωστό είναι obj3[j+rtrn(obj1)]=rtrpin(obj2,j);

και όχι obj3[j+rtr(obj1)]=rtrpin(obj2,j);

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το obj3 ειναι μεταβλητη, τι τυπου; Την δηλωνεις καπου;

Μηπως το σωστο ειναι

>Shape obj3 = new Shape [rtrn(obj1)+rtrn(obj2)];

η σύνταξη της εντολής new δεν είναι έτσι όπως την έχω εγώ δηλ:

ονομα=new τύπος;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

δες το σαν συναρτηση.

πχ

>
int a = 5;
a = miaSunartisiPouEpistrefeiInt();
a = 2 + a + 8;

// κατι παρομοιο με το παραπανω

Object o = otherObject;
o = miaSunartisiPouObject();
o = new Object();

οπως και να εχει ο τυπος της μεταβλητης πρεπει να δηλωνεται

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

έβαλα όπως λες στην αρχή

Shape obj3=obj1;

τώρα όμως μου χτυπάει άλλα όπως

"no match for 'operator[]' in 'obj3[(rtrn(obj1) + j)]'"

αυτά που κάνω εδώ(αυτά με τα bold) στέκουν η γράφω μαλακίες? :P

obj3 = new Shape [rtrn(obj1)+rtrn(obj2)];

obj3=rtrpin(obj1,i);

και return *obj3;//μπορώ να κάνω κάτι τέτοιο για να έχω σαν return ολόκληρο τον πίνακα?

 

class Shape{

int n; //ari8mos shmeiwn

Point *pin; //pinakas me tis suntetagmenes

public:

Shape(int o,Point *p);

Shape(){cout<<"Warning: shape has no points \n";};

void setPoint(int x,Point po);

void set(int y,Point* pi);

void printPoints();

friend int rtrn(Shape s){return s.n;};

friend Point rtrpin(Shape s,int i){return s.pin;};

~ Shape();

};

ελπίζω να μην κουράζω πολύ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

Υπάρχουν κάποια πράγματα που μπορείς να σκεφτείς και να βελτιώσεις χωρίς να έχεις φοβερές γνώσεις. Πρέπει όμως να καταλάβεις πως ακόμα και 10 απλούστατες γραμμές κώδικα σηκώνουν πολλή βελτίωση. Μερικά πράγματα που μου χτυπάνε στο μάτι:

  1. Χρησιμοποιείς πίνακα αντί για std::vector, also known as γράφεις "C με classes" και όχι C++.
  2. H class point δεν πέτυχε, έτυχε. Για παράδειγμα δεν καταλαβαίνω ποιά η διαφορά της set με τη setPoint και για ποιό λόγο πρέπει να υπάρχουν και οι δύο.
  3. Οι rtrn και rtrpin έχουν άθλια ονόματα και τις δηλώνεις friend ενώ ταυτόχρονα τις υλοποιείς και inline. Παρόλο που για λόγους πέρα από τον ορίζοντα αυτής της συζήτησης αυτό είναι επιθυμητό όταν οι συναρτήσεις δεν τροποποιούν εσωτερικά το αντικείμενο που παίρνουν σαν παράμετρο (όπως συμβαίνει και εδώ), δεν ξέρω ποιός ο λόγος του friend στη δική σου περίπτωση. Και βέβαια δεν είναι πως πειράζει σε κάτι να υπάρχει, αλλά ότι μου δίνει την αίσθηση πως υπάρχει εκεί γιατί δεν καταλαβαίνεις 100% τι βλέπεις μπροστά σου. Σου προτείνω να προσπαθήσεις να το πετύχεις.
  4. Αντίθετα, η printPoints() που θα έπρεπε να μην είναι member εντούτοις είναι (είναι συνυφασμένος με την αφηρημένη έννοια του σχήματος ο κώδικας που γράφει στο cout? φυσικά όχι)
  5. Οι functions γενικά δεν έχουν τις σωστές signatures (π.χ. πρέπει να παίρνουν Shape& ή const Shape& και αντίστοιχα Point, αυτές που δεν γράφουν στο Shape πρέπει να είναι const).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

η σύνταξη της εντολής new δεν είναι έτσι όπως την έχω εγώ δηλ:

ονομα=new τύπος;

 

Όχι.

 

Το new Τύπος Επιστρέφει Τύπος*

 

 

Διαφορετικά όταν μιλάς για κανονικό object ο constructor καλείται ώς εξής

 

>
//έστω η κλαση
class Object
{
public:
Object() {}
Object(int a) {}
}


Object a; // <- Θα κλειθεί Object::Object()
Object a(); // <- Θα κλειθεί Object::Object()
Object b(5); // <-Θα κλειθεί Object::Object(int)

 

Ενώ με το new έχεις

 

>
Object* d = new Object();

Object* e;
e = new Object();

 

Αρα για το new είναι

 

Τύπος* όνομα_μεταβλητής = new Τύπος()

 

Διάβασε γενικότερα για το lifecycle στην C++ (π.χ. εδώ) θα σου φανεί αρκετά χρήσημο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...