2013-08-05 15 views
7

In C müssen wir ein Strukturpräfix verwenden, wann immer wir eine Struktur deklarieren oder definieren wollen. Die Dinge wurden jedoch geändert, sobald die Struktur zu einer Art Klasse in C++ wurde. Wir müssen kein struct Präfix mehr verwenden, wenn wir eine Struktur deklarieren. In diesem Sinne, ich denke, das Struktur-Tag in C wurde ein Name eines Typs in C++.Ich kann die Strukturdeklaration in C++ nicht verstehen

Es bedeutet jedoch nicht, dass wir kein struct Präfix verwenden können. Wir können immer noch ein struct Präfix verwenden. Zum Beispiel führt Bjarne Stroustrup, der Ersteller von C++, ein Beispiel für die Deklaration einer Struktur mit und ohne Präfix struct ein, was mich verwirrt.

Unten sind Strukturdefinitionen, die versuchen, eine Struktur mit Template-Argument T zu erstellen. Diese kompilieren in Ordnung, ohne Fehler.

template<class T> struct linked_list { 
    T element; 
    linked_list<T> *next; 
}; 
template<class T> struct linked_list { 
    T element; 
    struct linked_list<T> *next; 
}; 

Nun sind unten Funktionsdeklarationen, deren Rückgabetyp und Argumenttyp Strukturen sind. Auch wenn diese von oben nicht anders sind, der erste von unten zwei Funktionsdeklarationen, die mit einer Struktur Präfix, ist mir einen Fehler mit Visual Studio C++ 2012

template<class T> struct linked_list<T> *add_list(T element, struct linked_list<T> *tail); 
template<class T> linked_list<T> *add_list(T element, linked_list<T> *tail); 

ich wirklich nicht verstehen, wie Dinge funktionieren. Ich verstehe die Unterschiede zwischen diesen Erklärungen nicht. Kann mir jemand eine detaillierte Erklärung geben?

+1

Fragen Sie, warum Sie das Schlüsselwort 'struct' in C++ weglassen können? [Warum braucht C das Schlüsselwort struct und nicht C++?] (Http://stackoverflow.com/questions/8422775/why-does-c-need-struct-keyword-and-not-c) – Blastfurnace

+0

Welcher Compiler bist du? benutzen? Nicht alle C++ entsprechen den Standards. – Anycorn

+1

@Blastfurnace Danke. Ich habe jedoch noch eine Frage. Der Link, den Sie mir gegeben haben, sagte, wenn es keine Zweideutigkeit gibt, "erlaubt" C++ das Weglassen des Schlüsselworts struct. Das bedeutet, dass wir das Schlüsselwort struct weiterhin verwenden können. Daraus folgt, dass meine zweiten Codes mehrdeutig sind, weil sie mir einen Fehler geben. Ich sehe jedoch keine Zweideutigkeit. Was ist los mit dir? – isbae93

Antwort

4

Anders als in C, in C++ kann das Schlüsselwort struct (und class) weggelassen werden, wenn es keine Ambiguität gibt. Wenn Unklarheit besteht, müssen Sie immer noch das Schlüsselwort struct verwenden. Ein berüchtigtes Beispiel ist POSIX 'stat: Es gibt eine struct stat und eine Funktion stat. Hier müssen Sie immer struct stat verwenden, um auf den Typ zu verweisen.

-1

Sie scheinen ziemlich gut zu verstehen, wie Sie es selbst erklären. In C++ ist das Schlüsselwort struct identisch mit der Keyword-Klasse, jedoch mit einem Standardwert für public statt private members. Wenn Sie also eine Klasse mit dem Schlüsselwort struct deklariert haben, verwenden Sie sie nicht erneut, wenn Sie auf diese Klasse verweisen. Sie scheinen zu versuchen, struct zu verwenden, wie es in C im ersten Beispiel verwendet würde. Das ist nur anders für C++.

+0

Sie sind im Grunde fasste seine Frage zusammen: – jrok

+0

Es ist jedoch möglich, dass wir ein Struktur-Präfix auch nach der Definition einer Struktur verwenden.Wir können dies in meinem ersten Code sehen.Es ist so kompliziert.:-( – isbae93

+0

Es ist nicht wirklich kompliziert, es ist nur das C++ ist eine andere Sprache als C. Das Schlüsselwort struct bedeutet etwas anderes. Objective-C ist eine Erweiterung von C, also bleibt C gültig, aber Stroustrup hat sich entschieden, keine solche Abwärtskompatibilität beim Entwerfen von C++ aufrechtzuerhalten. –

Verwandte Themen