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

C++ style


astrofos

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

Δημοσ.

Κάνω τα πρώτα μου βήματα σε C++ με το Qt framework.

 

1) Πιο στύλ είναι πιο σωστό:

>String* str, String *str ή String * str

 

2) Pointers vs Values

Στους κώδικες του βιβλίου C++ GUI Programming with Qt, υπάρχουν κλάσεις που έχουν πεδία άλλοτε με μορφή pointer και άλλοτε με μορφή value. π.χ.

 

>
class TextEdit : public QMainWindow
{
   // ...
private:
   QToolBar *tb;
   QString fileName;
}

 

Στη Java που έχω εμπειρία, πέρα των primitives, όλα τα object instances είναι references. Με ποιό το κριτήριο το tb ορίσθηκε ως pointer ενώ το fileName value;

Δημοσ.

Στο πρώτο ερώτημα, τα δύο πρώτα στυλ είναι εξ' ίσου δημοφιλή και αποδεκτά - το τρίτο όχι. Υπάρχουν πολλά debates σχετικά με την προτίμηση του 1ου vs 2ου. Το κύριο επιχείρημα του 1ου στύλ είναι ότι γράφεται όπως διαβάζεται (η μεταβλητή str είναι String pointer) και όπως χρησιμοποιείται στον κώδικα (χωρίς τον αστερίσκο). Το κύριο επιχείρημα του 2ου στυλ είναι ότι επιτρέπει γραμμές με πολλαπλές δηλώσεις μεταβλητών (String a,*b=0,...) και ότι συνδυάζει τύπο+όνομα μεταβλητής. Προσωπικά, χρησιμοποιώ και τους δύο (ανάλογα την περίπτωση), με τάση και προτίμηση προς τον 2ο.

 

Το δεύτερο ερώτημα είναι όντως διορατικό και σηκώνει πολλή συζήτηση. Η C++ προήρθε από τη C, μια γλώσσα γνωστή από τους pointers. Η σύγχρονη τάση είναι η ολοένα και μικρότερη χρήση pointers και αντικατάστασή τους με values, references ή auto-pointers. Η αλήθεια όμως είναι πως υπάρχουν περιπτώσεις όπου η χρήση ενός pointer εξυπηρετεί ή είναι αναπόφευκτη. Για παράδειγμα, είναι ο μόνος τρόπος για να έχεις προαιρετικό όρισμα (να μπορείς, δηλαδή, να περάσεις null ως object instance).

 

Δε γνωρίζω γιατί ο coder πήρε αυτήν την απόφαση στο παράδειγμά σου, χωρίς τον υπόλοιπο κώδικα. Μπορεί να χρειάζεται late-binding, stack vs heap instantiation, attach σε δομή ή argument σε API που θέλει pointers, το QToolbar να μην επιτρέπει stack instantiation, και χίλιους-δυο άλλους λόγους.

 

Τουλάχιστον, η C++ σου δίνει τη δυνατότητα της επιλογής...

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

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

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