In C ++ können Sie einen Zeiger auf eine Funktion haben, können Sie auch einen Zeiger auf eine Klasse haben?

7

Ich spreche nicht über einen Zeiger auf eine Instanz, ich möchte einen Zeiger auf eine Klasse selbst.

    
Alex Gaynor 13.11.2008, 00:06
quelle

9 Antworten

17

In C ++ sind Klassen nicht " erstklassige Objekte ". Am nächsten kommt ein Zeiger auf seine type_info -Instanz.

    
CesarB 13.11.2008, 00:10
quelle
5

Nein. Ein Zeiger ist die Adresse von etwas im Speicher des Computers zur Laufzeit. Eine Klasse ist nur eine Reihe von Anweisungen für den Compiler.

    
Will Dean 13.11.2008 00:07
quelle
4

Wie alle anderen bereits gesagt haben, ist es nicht möglich, einen Zeiger auf eine Klasse zu haben.

Wenn es jedoch darum geht, aus einer zur Laufzeit ausgewählten Klasse eine neue Instanz zu erstellen, sollten Sie die Entwurfsmuster Factory Method (oder Abstract Factory) ausprobieren.

    
CAdaker 13.11.2008 00:31
quelle
1

Ja und Nein. Das hängt von Ihrem Kontext ab, was Sie erreichen wollen. Wenn Sie einfach einen Zeiger auf einen Typ möchten, dann gibt es keinen Weg. Ein -Typ befindet sich nicht im Sinne eines Zeigers im Speicher.

Aus diesem Grund habe ich Ja gesagt, obwohl einige Leute die virtuelle Tabelle als Zeiger auf einen Typ betrachten würden. Es ist möglich, diesen Zeiger abzurufen, da die virtuelle Tabelle im Speicher vorhanden ist und zum Aufrufen virtueller Methoden mit ein wenig Tricks verwendet werden kann.

    
JaredPar 13.11.2008 00:09
quelle
1

Im Gegensatz zu echten objektbasierten Sprachen ist eine Klasse in C ++ kein Objekt, mehr ist das Mitleid. Am nächsten kommst du zu "Zeiger auf Klasse": RTTI:

const std :: type_info & amp; info = typeid (Objektausdruck);

type_info hat name () member function und sie können miteinander verglichen werden.

    
Arkadiy 13.11.2008 00:14
quelle
1

Eine "Klasse" existiert nicht. Das einzige, worauf Sie hinweisen können, sind die Daten.

Der Rest einer "Klasse" ist eigentlich eine Versandtabelle. Für jede Methode in der Klasse hat die Dispatch-Tabelle einen Zeiger. Auf diese Weise verweist die Klasse auf die korrekte Methode Ihrer Klasse, unabhängig davon, auf welchen Typ sie gerade angewendet wird. Dies wäre nutzlos für den Zugriff.

Methoden in Ihrer Klasse (die Dinge, auf die die Dispatch-Tabelle verweist) sind eigentlich nur "Funktionen", die in Ihrem Klassen-Datenzeiger übergeben werden. Die Definition einer Methode ist so ziemlich so, dass es eine Funktion ist, die die Daten der Klassen als Parameter verwendet. In den meisten Sprachen im C-Stil ist dieser Datenzeiger versteckt, wird aber als "this" bezeichnet.

Die Methoden für Ihre Klasse können über die Codebasis verteilt sein. Aufgrund von Elternklassen finden Sie diese Methoden wahrscheinlich nicht nebeneinander.

    
Bill K 13.11.2008 00:20
quelle
1

Sie können keinen (Laufzeit-) Zeiger auf eine Klasse haben, aber C ++ hat ein ähnliches Konzept für die Kompilierung: Vorlagenparameter . Boost hat ein library zur Manipulation dieser und einer Eigenschaften Bibliothek für Informationen über Klassen.

    
David Nehme 13.11.2008 00:32
quelle
0

Je nachdem, wie Sie über Zeiger denken möchten, können Sie einen "Zeiger" auf eine Klasse haben, wenn Sie mit Zeiger einen ganzzahligen Wert meinen. Mit Boost können Sie Typen registrieren und eine eindeutige Ganzzahl für jeden von Ihnen registrierten Typ zuweisen. Wenn es sich bei den Typen, die Sie registrieren, um alle Klassen handelt, können Sie zur Laufzeit den Code suchen, der zum Erstellen eines Objekts des gewünschten Typs erforderlich ist, sofern Sie über den Wert des gewünschten Typs verfügen. Aber im Allgemeinen sind Klassen keine erstklassigen Objekte in der Sprache und das Beste, worauf Sie hoffen können, ist das Verhalten, das Sie haben wollen, zu simulieren.

    
Mark Kegel 13.11.2008 03:31
quelle
0

Zwar gibt es keine Unterstützung für Reflektion / Introspektion in C ++, aber es gibt eine Reihe von Bibliotheken, die viele Java-Klassenfunktionen hinzufügen und es einem Programmierer ermöglichen, ein Objekt zu erhalten, das eine Klasse darstellt, und ein Instanz, etc. Google C ++ Reflexion.

    
Chris Morley 13.11.2008 03:44
quelle

Tags und Links