Verhindern, dass die Schaffung von Klasse, deren Elementfunktionen sind alle statischen

stimmen
9

Alle Mitgliedsvariablen und Member-Funktionen in meiner Klasse ClassA sind statisch.

Wenn ein Benutzer (versehentlich) versucht, ein Objekt dieser Klasse zu erstellen, erhält er eine Warnung: „KlasseA, lokaler Variable nie referenziert“, weil alle Funktionen statisch sind, so wird diese Aufgabe nie verwiesen. Also, ich möchte den Benutzer daran zu hindern versucht, ein Objekt dieser Klasse zu erstellen.

Wäre es genug sein, um einen privaten Standard (keine Variablen) Konstruktor zu erstellen? Oder muß ich auch private Kopie Konstruktor und privaten Zuweisungsoperator erstellen (verhindern, dass die Standardkonstruktoren verwenden)? Und wenn ich sie zu tun haben, zu schaffen, vielleicht wäre es besser, nur einige Dummy rein virtuelle Funktion stattdessen zu erstellen, und dies wird den Benutzer von der Erstellung eines Objekts verhindern?

Vielen Dank

Veröffentlicht am 09/12/2008 um 18:17
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
11

einen privaten Standardkonstruktor anlegen sollte ausreichend sein. Beide der anderen Standard-Konstrukte (Copykonstruktor und Zuweisung) stützen sich auf mit einer Instanz um korrekt zu arbeiten. Wenn es kein Default-Konstruktor ist, dann gibt es keine Möglichkeit, eine Instanz zu schaffen, damit keine Möglichkeit, tatsächlich auf den Kopie Konstruktionsteil zu bekommen.

Es würde Ihnen ein paar Kopfschmerzen wahrscheinlich speichern obwohl alle drei als private und nicht umgesetzt zu definieren.

Beantwortet am 09/12/2008 um 18:19
quelle vom benutzer

stimmen
3

Um eine Kopie Konstruktor zu verwenden, haben Sie ein Objekt haben, zu kopieren, so dass, wenn Sie den Standard-Konstruktor gesperrt haben, sollten Sie sicher sein.

Beantwortet am 09/12/2008 um 18:20
quelle vom benutzer

stimmen
20

Statt eine Klasse mit allen statischen Methoden zu verwenden, können Sie besser dran, um die Methoden freistehende Funktionen in einem eigenen Namensraum sein. Der Aufruf Syntax wäre das gleiche:

namespace::function() Anstatt von classname::function()

und Sie brauchen sich nicht mit jemandem zu tun versuchen, Ihre Klasse zu instanziieren.

Beantwortet am 09/12/2008 um 18:28
quelle vom benutzer

stimmen
10

Wie andere schon gesagt, ist ein Namespace, was Sie verwenden sollten. Wenn Sie mit Ihrer Klasse bleiben wollen, eine Klasse erstellen, die einen privaten Konstruktor hat, und leiten daraus, Ihre Absicht klar zu machen:

class NonConstructible { 
    NonConstructible();
};

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

Ok, jetzt wollen wir den Namensraum schauen, in die die eine und einzige Weg, dies zu tun:

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

    std::vector<int> globalIDs;
};

Sie können , dass die Verwendung rufen SuperUtils::foo();in beiden Fällen, aber der Namensraum hat den Vorteil , dass in einem Bereich , den Sie die Namespace - Deklaration und Richtlinie können bestimmte oder alle Mitglieder in den aktuellen Bereich zu bringen, so dass man sie ohne verweisen kann SuperUtils:::

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

Während im Allgemeinen vermieden werden, dass sollte, kann es hilfreich sein, wenn das Verfahren ausschließlich viel Material von SuperUtils mit, die dann die Lesbarkeit des Codes verbessern.

Beantwortet am 09/12/2008 um 18:54
quelle vom benutzer

stimmen
0

Der beste Weg, die Schaffung von nicht-Haufen Objekte zu verhindern, ist destructor privat zu machen. Dann gibt es keine Möglichkeit Compiler kann das Objekt zerstören, wenn es den Bereich verlässt und es wird sich beschweren. Dies wird nicht verhindern, dass jemand aus dem neuen aber tun.

Beantwortet am 10/12/2008 um 09:35
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more