Warum dürfen C ++ - Klassen keine Datenelemente haben?

7

Frage zu C ++ Warum ist die minimale Anzahl von Datenelementen in der Klassendefinition gleich Null?

Ich denke, es sollte eins sein, d. h. Zeiger auf eine virtuelle Tabelle, die vom Compiler

definiert wird

vielen Dank

    
user408015 01.08.2010, 17:05
quelle

6 Antworten

21

Es ist oft nützlich, eine Klasse ohne Datenelemente zur Verwendung in Vererbungshierarchien zu haben.

Eine Basisklasse darf nur einige typedef s haben, die in mehreren Klassen verwendet werden. Zum Beispiel sind in der std::iterator -Klassenvorlage nur die Standardtypen definiert, so dass Sie sie nicht in jeder Iteratorklasse definieren müssen.

Eine Schnittstellenklasse hat normalerweise keine Datenelemente, sondern nur virtuelle Elementfunktionen.

Eine virtuelle Tabelle hat nichts mit den Datenmitgliedern einer Klasse zu tun.

    
James McNellis 01.08.2010 17:07
quelle
5

Nun, eigentlich schreibt C ++ vor, dass alle Klassen Platz brauchen (Sie müssen in der Lage sein, einen Zeiger auf diese Klasse zu generieren). Sie benötigen jedoch nur einen Zeiger auf eine Vtable, wenn die Klasse polymorph ist. Es gibt keinen Grund für eine V-Tabelle in einer monomorphen Klasse.

    
Billy ONeal 01.08.2010 17:07
quelle
5

Ich arbeite an einer Bibliothek, die manchmal sogar Typen verwendet, die - keuchen! - sind nicht einmal definiert , geschweige denn Datenmitglieder!

Das heißt, der Typ ist unvollständig, z. B.

%Vor%

Dies wird verwendet, um einen eindeutigen Namen zu erstellen, nicht mehr.

Wofür ist das nützlich? Nun, wir verwenden es, um verschiedene Tags zu erstellen, die einen zusätzlichen (leeren, aber vollständig definierten) Typ verwenden:

%Vor%

Jetzt können Sie verschiedene Tags wie folgt erstellen:

%Vor%

Diese wiederum können verwendet werden, um spezialisierte Überlastungen zu disambiguieren. Viele STL-Implementierungen tun etwas Ähnliches:

%Vor%

Streng genommen ist die indirekte Route über eine gemeinsame Tag -Klassenvorlage überflüssig, aber zur Dokumentation ein nützlicher Trick.

All dies nur um zu zeigen, dass ein (strenges, statisches) System auf viele verschiedene Arten verwendet werden kann, nur um Daten zu bündeln und zu kapseln.

    
Konrad Rudolph 01.08.2010 19:01
quelle
0

Eine weitere Verwendung einer Klasse ohne Datenelemente ist die Verarbeitung von Daten aus anderen Quellen. Alles wird zur Laufzeit durch Zeiger oder Referenzen in die Klasse übernommen, und die Klasse bearbeitet die Daten, speichert sie aber nicht.

Ich hatte nicht wirklich darüber nachgedacht, bis ich es in einer UML-Klasse gesehen habe, die ich gemacht habe. Es hat seinen Nutzen, aber es erzeugt normalerweise gekoppelte Klassen.

    
JustBoo 01.08.2010 19:35
quelle
0

Weil Klassen keine Strukturen sind. Ihr Zweck ist, entgegen der landläufigen Meinung, nicht um Daten zu speichern.

Betrachten Sie zum Beispiel eine Validator-Basisklasse, die eine virtuelle Methode definiert, die eine zu validierende Zeichenkette übergibt, und ein Bool zurückgibt.

Eine Instanz eines Validators kann Zeichenfolgen ablehnen, die Großbuchstaben enthalten. Dies ist ein perfektes Beispiel dafür, wann Sie eine Klasse verwenden sollten, und durch die Definition dessen, was sie tut, gibt es offensichtlich keinen Grund, irgendwelche Mitgliedsvariablen zu haben.

    
kyoryu 01.08.2010 19:39
quelle
0
  

Frage zu C ++, warum die minimale Anzahl von Datenelementen in der Klassendefinition Null ist

Es ist Null, weil Sie verschiedene Fälle von Klassen haben, die keine Mitglieder haben sollten:

Sie können Traits-Klassen implementieren, die beispielsweise nur statische Funktionen enthalten . Diese Klassen entsprechen einem namespace , das auch als Typ erkennbar ist. Das heißt, Sie können eine Vorlage für die Klasse instanziieren und sicherstellen, dass die Implementierung dieser Vorlage die Funktionen innerhalb der Klasse verwendet. Die Größe einer solchen Merkmalsklasse sollte null sein.

Beispiel:

%Vor%

Sie können eindeutige Klassenkategorien definieren, indem Sie "tag" -Klassen implementieren : Klassen, die keine Schnittstelle oder Daten enthalten, aber nur zur Unterscheidung zwischen verschiedenen "logischen" Typen abgeleiteter Klassen verwendet werden. Die Unterscheidung kann in normalem OOP-Code oder in Vorlagencode verwendet werden. Diese "Tag" -Klassen haben ebenfalls eine Größe von 0. Ein Beispiel finden Sie in der iterators-Tags-Implementierung in Ihrer aktuellen STL-Bibliothek.

Ich bin mir sicher, dass es noch andere Fälle gibt, in denen Sie "zero-size" Klassen verwenden können.

    
utnapistim 02.08.2010 09:08
quelle

Tags und Links