2015-01-18 7 views
10

Bevor jemand fragt, ja, das ist Teil einer Hausaufgabe, und ja, ich habe eine Menge googeln vor der Nachfrage. Ich habe die letzte Stunde intensiv mit Google auf vielen, vielen verschiedenen Keywords geforscht, konnte aber nichts finden.'class' Schlüsselwort in Variablendefinition in C++

geht also hier die Frage:

Was bedeutet die folgende Variablendefinition bedeuten: class MyClass* myClass;?

habe ich versucht, diesen Code mit so etwas wie class MyClass* myClass = new MyClass(); und fand, dass es einfach einen Zeiger auf eine neue Instanz von MyClass schafft.

Also, was ist der Vorteil der Verwendung der class Vorwahl? Macht es einen Unterschied?

Hat jemand einen Link zu einigen Ressourcen darüber? Ich konnte einfach nichts finden (es ist wirklich, wirklich schwer, andere Dinge als "Klassendefinition" zu finden!).

Vielen Dank!

+0

Können Sie einen Zusammenhang angeben, wo Sie das gesehen haben? War es eine Membervariable in einer Klasse? Scheint mir, als könnte es eine Vorwärtsdeklaration in Kombination mit einer variablen Deklaration sein. – Borgleader

+0

Sie würden es fast nie brauchen. Ein obskurer Fall ist, wenn der Klassenname durch eine Variable oder Funktion verdeckt wird: 'class MyClass {}; int MeineKlasse; MyClass * myClass = NULL; '(kompiliert nicht, aber Sie können' class' hinzufügen, um auf einen ansonsten versteckten Namen zu verweisen). –

Antwort

13

Ein ausgearbeiteter Typspezifizierer ist ein Typname, dem das Schlüsselwort class, struct, enum oder union vorausgeht.

class identifier 
struct identifier 
enum identifier 
union identifier 

ausgearbeitete Typspezifikation entweder zur Hervorhebung verwendet wird, oder einen Typnamen zu offenbaren, der durch die Deklaration einer Variablen mit dem gleichen Namen in dem gleichen Rahmen verborgen ist.

source

+0

Plus 1 für die Erwähnung ausgearbeiteter Typspezifizierer – namezero

6

Tatsächlich ist es optional, class beim Erstellen von Objekt der Klasse zu verwenden. In C-Sprache ist es zwingend erforderlich, struct vor dem Namen der Struktur zu verwenden, um ihre Variable zu erstellen. Da C++ eine Obermenge von C ist, gibt es in C++ nur einen Unterschied zwischen struct und class, und das ist der Zugriffsmodifikator.

Um rückwärtskompatibel zu bleiben, ist es zulässig.

So

class MyClass* myClass = new MyClass(); 

Und

MyClass* myClass = new MyClass(); 

sind beide gleich.

+2

C++ ist * fast * eine Obermenge von C. Auch Ihre Antwort bezog sich ursprünglich auf C in der Vergangenheitsform; C existiert noch und die Regeln in diesem Bereich sind unverändert. –

1

Die Worte "inline forward-Deklaration" müssen hier erwähnt werden!

Eine Forward-Deklaration ist einfach eine Möglichkeit, den Compiler über einen Typnamen zu informieren, bevor er tatsächlich definiert wurde. Sie finden diese immer in den Header-Dateien.

// MyStruct.h 
class MyClass; 

struct MyStuct { 
    MyClass* m_myClass; 
    void foo(); 
} 

// MyStruct.cpp 
#inlude "MyClass.h" 
void MyStruct::foo() { m_myClass->SomeFunc(); } 

Beachten Sie, dass die Header-Datei deklariert nur MyClass als Klassenkennung und hat keine Ahnung, was es eigentlich, bis sein über die # include in der CPP-Datei definiert ist. Dies ist eine Vorwärtsdeklaration.

Inline-Forward-Deklaration ist wirklich die gleiche Sache, aber Sie tun es einfach alles in einer Zeile. Dies ist derselbe genaue Code, der dasselbe erreicht.

Ich fühle mich wie die meisten Programmierer bevorzugen die Standard-Forward-Deklaration-Methode (insgesamt weniger tippen insgesamt). Deshalb kann es verwirrend sein, wenn Sie auf die weniger verwendete Inline-Version stolpern.

Ich sehe viele der Antworten hier ein optionales Schlüsselwort nennen, aber im obigen Kontext der Inline-Forward-Deklaration ist es sehr nicht optional, und führt zu Kompilierungsfehlern aufgrund fehlender Typspezifizierer.

+0

Der C++ - Standard verwendet nicht die Begriffe "Forward-Deklaration" oder "Inline-Forward-Deklaration". Die Standardbegriffe sind "Deklaration" und "Typspezifizierer", wie an anderer Stelle in diesem Thread erwähnt. Vielleicht haben Sie auch die andere Antwort falsch gelesen, die besagt: "Eigentlich ist es optional, Klasse ** zu verwenden, während Objekt ** der Klasse erstellt wird" - um ein Objekt zu erstellen, muss der Typ vollständig sein und ist optional 'class' zu verwenden, da der Typ bereits abgeschlossen ist. –

Verwandte Themen