Πίνακας περιεχομένων:

Πώς να κάνετε το μοτίβο σχεδίασης Singleton σε C ++: 9 βήματα
Πώς να κάνετε το μοτίβο σχεδίασης Singleton σε C ++: 9 βήματα

Βίντεο: Πώς να κάνετε το μοτίβο σχεδίασης Singleton σε C ++: 9 βήματα

Βίντεο: Πώς να κάνετε το μοτίβο σχεδίασης Singleton σε C ++: 9 βήματα
Βίντεο: ЗАПРЕЩЁННЫЕ ТОВАРЫ с ALIEXPRESS 2023 ШТРАФ и ТЮРЬМА ЛЕГКО! 2024, Ιούνιος
Anonim
Πώς να κάνετε το μοτίβο σχεδίασης Singleton σε C ++
Πώς να κάνετε το μοτίβο σχεδίασης Singleton σε C ++

Εισαγωγή:

Ο σκοπός αυτού του οδηγού οδηγιών είναι να διδάξει στον χρήστη πώς να εφαρμόζει το μοτίβο σχεδίου μονής στο πρόγραμμα C ++. Με αυτόν τον τρόπο, αυτό το σύνολο οδηγιών θα εξηγήσει επίσης στον αναγνώστη γιατί τα στοιχεία ενός μονόπετρου είναι όπως είναι και πώς επεξεργάζεται ο κώδικας. Γνωρίζοντας αυτό, θα βοηθήσετε στο μέλλον τον εντοπισμό σφαλμάτων στα μελλοντικά σας singletons. Ποιο είναι το μοτίβο σχεδίου ενός ατόμου; Το μοτίβο σχεδίασης είναι ένα μοτίβο σχεδίασης όπου ο κωδικοποιητής δημιουργεί μια κλάση που μπορεί να εφαρμοστεί μόνο μία φορά, ενώ οι δημόσιες λειτουργίες των τάξεων μπορούν να έχουν πρόσβαση οπουδήποτε, αρκεί να έχετε #συμπεριλάβει το αρχείο κεφαλίδας σε άλλα αρχεία που σχετίζονται με το έργο.

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

Ενώ η δυσκολία του μοτίβου σχεδίου είναι απλή σε σύγκριση με άλλα σχέδια σχεδίασης, αυτό το σετ οδηγιών έχει μια μέση δυσκολία. Αυτό σημαίνει ότι για να κάνετε αυτές τις οδηγίες, σας συνιστούμε να γνωρίζετε τις βασικές και εκ των προτέρων απαιτήσεις σύνταξης του C ++. Θα πρέπει επίσης να γνωρίζετε τη σωστή εθιμοτυπία κωδικοποίησης C ++ (δηλ. Κρατήστε τις μεταβλητές κλάσης ιδιωτικές, μία κλάση ανά αρχείο κεφαλίδας κ.λπ.). Θα πρέπει επίσης να ξέρετε πώς να απελευθερώσετε τη μνήμη και πώς λειτουργούν οι κατασκευαστές και οι καταστροφείς σε C ++.

Αυτός ο εκπαιδευτικός οδηγός θα διαρκέσει κατά μέσο όρο περίπου 10-15 λεπτά.

Απαιτήσεις υλικού:

-Ένας υπολογιστής (μπορεί να είναι PC ή Mac) ικανός να τρέξει Visual Studios (οποιαδήποτε έκδοση)

-Ένα απλό πρόγραμμα, που δημιουργήθηκε στα Visual Studios, με το οποίο μπορείτε να δοκιμάσετε το singleton σας

Σημείωση: Το μοτίβο σχεδίασης μπορεί να γίνει σε οποιοδήποτε άλλο υποστηρικτικό C ++ IDE ή διεπαφή κωδικοποίησης, αλλά για αυτό το σύνολο οδηγιών, θα χρησιμοποιήσουμε την Visual Studios Enterprise Edition.

Βήμα 1: Δημιουργήστε την τάξη σας, με αρχείο κεφαλίδας και αρχείο CPP

Δημιουργήστε την τάξη σας, με αρχείο κεφαλίδας και αρχείο CPP
Δημιουργήστε την τάξη σας, με αρχείο κεφαλίδας και αρχείο CPP
Δημιουργήστε την τάξη σας, με αρχείο κεφαλίδας και αρχείο CPP
Δημιουργήστε την τάξη σας, με αρχείο κεφαλίδας και αρχείο CPP

Για να δημιουργήσετε ταυτόχρονα αυτά τα δύο αρχεία και την τάξη, ανοίξτε το έργο / το πρόγραμμα σας στο Visual Studios, μεταβείτε στον εξερευνητή λύσεων, κάντε δεξί κλικ και θα εμφανιστεί ένα πλαίσιο κοντά στο δρομέα του ποντικιού σας, βρείτε την επιλογή "Προσθήκη", τοποθετήστε το δείκτη του ποντικιού πάνω από αυτό, και ένα άλλο πλαίσιο θα πρέπει να εμφανίζεται στα δεξιά. Σε αυτό το πλαίσιο, θέλετε να βρείτε την επιλογή "Νέο στοιχείο..", κάντε κλικ σε αυτό και θα εμφανιστεί ένα παράθυρο, που μοιάζει με την παρακάτω φωτογραφία 1.1. Σε αυτό το παράθυρο θέλετε να επιλέξετε "C ++ Class" και μετά πατήστε "Add". Αυτό θα ανοίξει ένα άλλο παράθυρο που μοιάζει με την εικόνα 1.2. Σε αυτό το παράθυρο, πληκτρολογείτε το όνομα της τάξης σας στο πεδίο "Όνομα τάξης" και τα Visual Studios θα ονομάσουν αυτόματα το πραγματικό αρχείο μετά το όνομα της τάξης. Για το σκοπό αυτής της οδηγίας, θα ονομάσουμε την τάξη μας "EngineDebugSingleton", αλλά μπορεί να είναι οποιοδήποτε όνομα που βασίζεται σε γράμματα. Τώρα μπορείτε να πατήσετε "OK" και να προχωρήσετε στο βήμα 2.

Σημείωση: Ο εξερευνητής λύσεων και ο τόπος όπου τα αρχεία διατηρούνται στον υπολογιστή σας είναι ξεχωριστά. Η μετακίνηση ή η δημιουργία οτιδήποτε στον εξερευνητή λύσεων δεν θα μετακινήσει ή θα οργανώσει τα αρχεία εντός του προγράμματος περιήγησης αρχείων OS. Ένας ασφαλής τρόπος για να οργανώσετε τα αρχεία σας από την πλευρά του εξερευνητή αρχείων θα ήταν να αφαιρέσετε, αλλά όχι να διαγράψετε τα συγκεκριμένα αρχεία από τον εξερευνητή λύσεων, να μετακινήσετε τα ίδια αρχεία στον εξερευνητή αρχείων στην επιθυμητή θέση και, στη συνέχεια, να επιστρέψετε στον εξερευνητή λύσεων, κάντε δεξί κλικ, βρείτε την επιλογή "Προσθήκη", στη συνέχεια βρείτε "Υπαρχόντα αντικείμενο" και βρείτε τα αρχεία που μετακινήσατε. Βεβαιωθείτε ότι έχετε μετακινήσει τόσο το αρχείο κεφαλίδας όσο και το αρχείο cpp.

Βήμα 2: Ορίστε το Constructor σε Private

Ορίστε το Constructor σε Private
Ορίστε το Constructor σε Private

Με το αρχείο CPP και το αρχείο κεφαλίδας που δημιουργήσατε πρόσφατα, εάν δεν άνοιξε αυτόματα όταν το δημιουργήσατε, μεταβείτε στον εξερευνητή λύσεων και κάντε κλικ και ανοίξτε το "EngineDebugSingleton.h". Στη συνέχεια θα σας υποδεχτούν με ένα "EngineDebugSingleton ()", τον προεπιλεγμένο κατασκευαστή κλάσης και "~ EngineDebugSingleton ()" τον καταστροφέα τάξης. Για αυτό το βήμα, θα θέλουμε να ορίσουμε τον κατασκευαστή στο ιδιωτικό, αυτό σημαίνει ότι αυτή η συνάρτηση είναι διαθέσιμη μόνο στην κλάση και τίποτα άλλο. Με αυτό, δεν θα μπορείτε να δημιουργήσετε μια μεταβλητή ή να διαθέσετε την κλάση στη μνήμη εκτός της κλάσης, μόνο στο αρχείο κεφαλίδας των τάξεων και στις άλλες συναρτήσεις των τάξεων. Το να έχετε τον κατασκευαστή ιδιωτικό είναι το κλειδί για το μοτίβο σχεδίασης και τον τρόπο λειτουργίας των μονόκλινων. Θα ανακαλύψουμε σε μελλοντικά βήματα τον τρόπο με τον οποίο ένα μονόπετρο προωθείται και έχει πρόσβαση.

Η τάξη θα πρέπει τώρα να μοιάζει με αυτήν αφού μετακινήσετε τον κατασκευαστή σε ιδιωτικό (Δείτε τη σχετική φωτογραφία)

Βήμα 3: Ορίστε το Destructor σε Private

Ορίστε το Destructor σε Private
Ορίστε το Destructor σε Private

Όπως κάναμε με τον κατασκευαστή

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

Η τάξη θα πρέπει τώρα να μοιάζει με αυτήν αφού ολοκληρώσετε αυτό το βήμα. (Δείτε τη σχετική φωτογραφία)

Βήμα 4: Δημιουργία μεταβλητής στατικού δείκτη στο Singleton

Δημιουργία μεταβλητής στατικού δείκτη στο Singleton
Δημιουργία μεταβλητής στατικού δείκτη στο Singleton

Σε αυτό το βήμα, θα δημιουργήσουμε ένα

μεταβλητή στατικού δείκτη τύπου "EngineDebugSingleton*". Αυτή θα είναι η μεταβλητή που θα χρησιμοποιηθεί για την κατανομή του singleton μας στη μνήμη και θα τον δείχνει για όλο το χρόνο που το singleton μας κατανέμεται στη μνήμη.

Έτσι πρέπει να μοιάζει το αρχείο κεφαλίδας μετά τη δημιουργία αυτής της μεταβλητής

Βήμα 5: Δημιουργία μιας συνάρτησης παρουσίας

Δημιουργία συνάρτησης παρουσίας
Δημιουργία συνάρτησης παρουσίας

Τώρα θέλουμε να κάνουμε ένα παράδειγμα

λειτουργία. Η συνάρτηση θα πρέπει να είναι μια στατική συνάρτηση και θα θέλει να επιστρέψει μια αναφορά στην τάξη μας ("EngineDebugSingleton &"). Καλέσαμε τη λειτουργία μας Instance (). Στην ίδια τη συνάρτηση, θα θέλουμε πρώτα να ελέγξουμε αν ptrInstance == nullptr (μπορεί να συντομευθεί σε! PtrInstance), αν είναι nullptr, αυτό σημαίνει ότι το απλό δεν έχει κατανεμηθεί και στο πεδίο της εντολής if, θα θέλουν να διαθέσουν κάνοντας ptrInstance = νέο EngineDebugSingleton (). Αυτό είναι το σημείο όπου πραγματικά κατανέμετε το singleton στη μνήμη. Αφού βγούμε από το πεδίο της εντολής if, θα επιστρέψουμε αυτό που δείχνει η ptrInstance, η οποία συμβολίζεται με τη σύνταξη "*ptrInstance". Θα χρησιμοποιούμε αυτή τη συνάρτηση σε μεγάλο βαθμό κατά τη δημοσίευση των στατικών μας λειτουργιών, ώστε να μπορούμε να ελέγξουμε αν το μονότονο έχει δημιουργηθεί και έχει διατεθεί στη μνήμη. Ουσιαστικά, αυτή η συνάρτηση το καθιστά έτσι ώστε να μπορείτε να έχετε μόνο μία κατανομή της τάξης και όχι περισσότερο.

Έτσι πρέπει να μοιάζει η τάξη μας μετά τη δημιουργία της συνάρτησης Instance (). Όπως μπορείτε να δείτε, όλα όσα έχουμε κάνει έχουν μείνει στο ιδιωτικό τμήμα της τάξης, αυτό πρόκειται να αλλάξει λίγο στα επόμενα βήματα.

Βήμα 6: Δημιουργία στατικών δημόσιων λειτουργιών

Δημιουργία στατικών δημόσιων λειτουργιών
Δημιουργία στατικών δημόσιων λειτουργιών
Δημιουργία στατικών δημόσιων λειτουργιών
Δημιουργία στατικών δημόσιων λειτουργιών
Δημιουργία στατικών δημόσιων λειτουργιών
Δημιουργία στατικών δημόσιων λειτουργιών

Αφού κάνετε τη συνάρτηση από

βήμα 5, μπορείτε να αρχίσετε να δημιουργείτε στατικές δημόσιες λειτουργίες. Κάθε δημόσια λειτουργία θα πρέπει να έχει μια ιδιωτική συνάρτηση για να την ακολουθήσει, το όνομα αυτής της συνάρτησης δεν μπορεί να είναι το ίδιο. Γιατί να κάνουμε τη λειτουργία Στατική; Κάνουμε τις δημόσιες λειτουργίες στατικές, ώστε να μπορούν να έχουν πρόσβαση χωρίς πραγματικό αντικείμενο. Έτσι, αντί να κάνουμε κάτι σαν "EngineDebugSingleObj-> SomeFunction ()", κάνουμε "EngineDebugSingleton:: Some Function ()". Αυτό καθιστά δυνατή την πρόσβαση ενός singleton βασικά οπουδήποτε στον κώδικα, υπό την προϋπόθεση ότι έχετε #συμπεριλάβει το αρχείο κεφαλίδας στο συγκεκριμένο αρχείο έργου με το οποίο εργάζεστε. Με αυτό, μπορείτε επίσης να δημιουργήσετε το singleton μέσω οποιασδήποτε δημόσιας λειτουργίας του.

Για τους σκοπούς μας σε αυτό το βήμα δημιουργήσαμε δύο δημόσιες στατικές κενές συναρτήσεις, "προσθήκη ()" και "αφαίρεση ()". Στην ιδιωτική ενότητα, έχουμε δύο ακόμη λειτουργίες, "PrivAdd ()" και "PrivSubtract ()". Προσθέσαμε επίσης μια μεταβλητή int που ονομάζεται "NumberOfThings". Ο ορισμός για αυτές τις συναρτήσεις θα μπει στο αρχείο CPP των τάξεων μας. Για να κάνετε εύκολα τη συνάρτηση να μπει στο αρχείο CPP, επισημαίνετε, με τον κέρσορα, τη συνάρτηση, η οποία θα πρέπει να έχει μια πράσινη γραμμή κάτω από αυτήν και πατάτε "Left ALT + ENTER", θα σας δώσει την επιλογή δημιουργίας του ορισμού στο συσχετισμένο αρχείο CPP τάξεων. Δείτε τη φωτογραφία 6.1 για να δείτε πώς πρέπει να είναι το αρχείο κεφαλίδας και αφού δημιουργήσετε όλους τους ορισμούς συνάρτησης, το CPP σας θα μοιάζει με τη φωτογραφία 6.2, εκτός από το ότι οι ορισμοί των λειτουργιών σας δεν θα έχουν κώδικα.

Τώρα θα θέλετε να προσθέσετε τον ίδιο κωδικό όπως στη φωτογραφία 6.2 στους ορισμούς των λειτουργιών σας. Όπως προαναφέρθηκε, οι δημόσιες λειτουργίες μας θα κάνουν χρήση της συνάρτησης Instance (), η οποία θα επιστρέψει αυτό που υποδεικνύει η ptrInstance. Αυτό μας επιτρέπει να έχουμε πρόσβαση στις ιδιωτικές λειτουργίες της τάξης μας. Με οποιαδήποτε δημόσια λειτουργία Singleton, θα πρέπει να καλείτε μόνο αυτήν τη λειτουργία Instance. Η μόνη εξαίρεση σε αυτό είναι η λειτουργία τερματισμού.

Σημείωση: Οι ακριβείς δημόσιες και ιδιωτικές λειτουργίες που εμφανίζονται σε αυτό το βήμα δεν είναι απαραίτητες, μπορείτε να έχετε διαφορετικά ονόματα και λειτουργίες στην ιδιωτική συνάρτηση, αλλά για κάθε τύπο δημόσιας λειτουργίας, θα πρέπει να έχετε μια ιδιωτική λειτουργία για να την ακολουθήσετε και η δημόσια λειτουργία θα πρέπει πάντα να χρησιμοποιεί, στην περίπτωσή μας, τη συνάρτηση Instance ().

Βήμα 7: Δημιουργία της συνάρτησης τερματισμού

Δημιουργία της συνάρτησης τερματισμού
Δημιουργία της συνάρτησης τερματισμού
Δημιουργία της συνάρτησης τερματισμού
Δημιουργία της συνάρτησης τερματισμού

Δεδομένου ότι μπορούμε να αφαιρέσουμε μόνο το singleton μας από τη μνήμη στην τάξη μας, πρέπει να δημιουργήσουμε μια στατική δημόσια λειτουργία. Αυτή η συνάρτηση θα καλέσει τη διαγραφή στο ptrInstance, το οποίο καλεί την καταστροφή της κλάσης και, στη συνέχεια, θα θέλουμε να επαναφέρουμε το ptrInstance σε nullptr, ώστε να μπορεί να εκχωρηθεί ξανά εάν δεν τελειώσει το πρόγραμμά σας. Θα θέλετε επίσης να τερματίσετε το Singletons σας για να καθαρίσετε οποιαδήποτε εκχωρημένη μνήμη που διαθέσατε στις ιδιωτικές μεταβλητές του Singleton.

Βήμα 8: Ρύθμιση του PtrInstance σε Nullptr

Ρύθμιση PtrInstance σε Nullptr
Ρύθμιση PtrInstance σε Nullptr

Για να ολοκληρώσετε το singleton σας, θέλετε να μεταβείτε στο αρχείο EngineDebugSingleton. CPP και στο επάνω μέρος του αρχείου CPP, στην περίπτωσή μας, πληκτρολογήστε "EngineDebugSingleton* EngineDebugSingleton:: ptrInstance = nullptr."

Κάνοντας αυτό θα ορίσει αρχικά το ptrInstance σε nullptr, οπότε όταν περάσετε για πρώτη φορά από τη συνάρτηση στιγμιότυπου, η τάξη μας θα επιτρέπεται να κατανέμεται στη μνήμη. Χωρίς αυτό, πιθανότατα θα λάβετε ένα σφάλμα επειδή θα προσπαθείτε να αποκτήσετε πρόσβαση στη μνήμη που δεν έχει εκχωρήσει τίποτα σε αυτήν.

Βήμα 9: Δοκιμή και συμπέρασμα

Δοκιμή και Συμπέρασμα
Δοκιμή και Συμπέρασμα

Τώρα θα θέλουμε να ελέγξουμε ότι το singleton μας για να βεβαιωθούμε ότι λειτουργεί, αυτό θα περιλαμβάνει την κλήση των δημόσιων λειτουργιών όπως περιγράφεται στο βήμα 6 και σας συνιστούμε να ορίσετε σημεία διακοπής για να περπατήσετε τον κώδικά σας και να δείτε ότι το singleton λειτουργεί ως θα έπρεπε να είναι. Η αφετηρία μας θα είναι στο main.cpp του έργου μας και το main.cpp μας μοιάζει τώρα με την παρακάτω εικόνα.

Συγχαρητήρια! Μόλις ολοκληρώσατε την πρώτη σας εφαρμογή του Singleton Design Pattern. Με αυτό το μοτίβο σχεδίασης, μπορείτε τώρα να βελτιστοποιήσετε τον κώδικά σας με διάφορους τρόπους. Για παράδειγμα, τώρα μπορείτε να δημιουργήσετε συστήματα διαχείρισης που λειτουργούν καθ 'όλη τη διάρκεια εκτέλεσης του προγράμματος σας, στα οποία μπορείτε να έχετε πρόσβαση μέσω στατικών συναρτήσεων οπουδήποτε και αν έχετε συμπεριλάβει την τάξη.

Το τελικό αρχείο κεφαλίδας πρέπει να μοιάζει με τη φωτογραφία 7.1. Το σχετικό αρχείο CPP του singleton σας θα πρέπει να μοιάζει με τη φωτογραφία 6.2 με την προσθήκη, στο επάνω μέρος του αρχείου, του κώδικα που εμφανίζεται στο βήμα 8. Αυτή η οδηγία σάς παρείχε μια απλή δομή του μοτίβου σχεδίου Singleton.

Συμβουλές αντιμετώπισης προβλημάτων:

Λαμβάνετε σφάλματα που σχετίζονται με τη μνήμη;

Βεβαιωθείτε ότι αναφέρεστε στο βήμα 7 και στο βήμα 8 για να βεβαιωθείτε ότι ορίζετε το ptrInstance σε nullptr.

Συμβαίνει άπειρος βρόχος;

Βεβαιωθείτε ότι για τις δημόσιες λειτουργίες, στους ορισμούς τους, καλείτε την ιδιωτική λειτουργία, όχι την ίδια δημόσια λειτουργία.

Αντικείμενα που κατανέμονται στο singleleton που προκαλούν διαρροές μνήμης;

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