
Όλες οι μεταβλητές μέλη και οι λειτουργίες του μέλους στην τάξη ClassA μου είναι στατική. 


Αν ένας χρήστης προσπαθεί (κατά λάθος) για να δημιουργήσετε ένα αντικείμενο αυτής της κατηγορίας, λαμβάνει μια προειδοποίηση: «ClassA, τοπική μεταβλητή δεν αναφέρεται», επειδή όλες οι λειτουργίες είναι στατική, έτσι ώστε αυτό το αντικείμενο δεν αναφέρεται. Έτσι, θέλω να αποτρέψει το χρήστη από την προσπάθεια να δημιουργήσει ένα αντικείμενο αυτής της κατηγορίας.


Θα ήταν αρκετό για να δημιουργήσει ένα ιδιωτικό default (χωρίς μεταβλητές) κατασκευαστή; Ή μήπως πρέπει να δημιουργήσει επίσης ιδιωτικό κατασκευαστή αντιγραφή και χειριστή ιδιωτικών ανάθεσης (για να αποφευχθεί χρησιμοποιώντας τις προεπιλεγμένες κατασκευαστές); Και αν χρειάζεται να τους δημιουργήσει πάρα πολύ, ίσως θα ήταν καλύτερα απλά για να δημιουργήσει κάποια εικονική καθαρό εικονική λειτουργία αντ 'αυτού, και αυτό θα αποτρέψει το χρήστη από το να δημιουργήσει ένα αντικείμενο;


Ευχαριστώ

 
Αποτροπή δημιουργίας της τάξης των οποίων οι λειτουργίες μέλος είναι όλα στατικές
=================================================================================



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



```
class NonConstructible { 
    NonConstructible();
};

class SuperUtils: NonConstructible {
    static void foo();
    // ...
    static std::vector<int> globalIDs;
    // ...
};

```



---


Εντάξει, τώρα ας εξετάσουμε το χώρο ονομάτων που είναι ο ένας και μοναδικός τρόπος για να γίνει αυτό:



```
namespace SuperUtils {
    void foo() {
        // ....
    }

    std::vector<int> globalIDs;
};

```

Μπορείτε να καλέσετε ότι η χρήση `SuperUtils::foo();`και στις δύο περιπτώσεις, αλλά ο χώρος ονομάτων έχει το πλεονέκτημα ότι σε ένα πεδίο, μπορείτε να χρησιμοποιήσετε τη δήλωση namespace και οδηγία να φέρει ορισμένα ή όλα τα μέλη στο τρέχον πεδίο εφαρμογής, έτσι ώστε να μπορείτε να τους αναφορά χωρίς τη χρήση `SuperUtils::`:



```
void superFunction() {
    using namespace SuperUtils;
    foo();
}

```

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

 

Αντί να χρησιμοποιεί μια τάξη με όλες τις στατικές μεθόδους, ίσως είναι καλύτερα να κάνει τις μεθόδους επιδαπέδια λειτουργεί σε ξεχωριστό χώρο ονομάτων. Η σύνταξη κλήση θα είναι το ίδιο:


`namespace::function()` αντί `classname::function()`


και δεν χρειάζεται να ασχοληθεί με κάποιον που προσπαθεί να υπόσταση τάξη σας.

 

Η δημιουργία ενός ιδιωτικού προεπιλογή κατασκευαστή πρέπει να είναι επαρκής. Και οι δύο άλλες προεπιλεγμένες δομές (αντίγραφο έργου και εκχώρηση) βασίζονται σε έχει ένα παράδειγμα για να λειτουργήσει σωστά. Αν δεν υπάρχει default constructor τότε δεν υπάρχει κανένας τρόπος για να δημιουργήσετε μια παρουσία, ως εκ τούτου, δεν υπάρχει τρόπος για να πάρει πραγματικά για το τμήμα κατασκευής αντίγραφο. 


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

 

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

 

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

 