Forward-Deklaration als struct vs class

Lesezeit: 2 Minuten

Benutzer-Avatar
Thomas Andrle

Ich habe einen Fehler in einer C++-Forward-Deklaration einer Klasse gefunden, die fälschlicherweise als deklariert wurde struct Book anstatt class Book. Ich denke, Book war früher eine Struktur, wurde in eine Klasse geändert, aber die Forward-Deklarationen blieben.

Buch.h:

class Book {
    ...
};

Bibliothek.h:

struct Book;

class Library {
    std::vector<Book*> books;
};

Es gab keine Compiler-Warnungen und das resultierende Programm schien gut zu funktionieren. Es hat mich neugierig gemacht: Kann das theoretisch jemals zu Problemen führen? Es ist nur ein Zeiger, ja, aber wenn die Klasse zum Beispiel virtuelle Methoden und Mehrfachvererbung hätte, könnten die Zeiger anders sein?

Ich kenne die Unterschiede zwischen Klasse/Struktur in Bezug auf die Standardeinstellung öffentlich/privat, aber ich frage speziell nach den Vorwärtsdeklarationen und möglichen Konsequenzen ihres Austauschs.

AKTUALISIEREN Neuere Versionen von Xcode geben jetzt diese Warnung aus, wenn es eine Diskrepanz gibt:

Struct 'Book' was previously declared as a class; this is valid, but may result in linker errors under the Microsoft C++ ABI

  • Es ist kein Fehler in C++, aber VS könnte Ihnen etwas Kummer bereiten.

    – Juanchopanza

    22. November 2016 um 9:43 Uhr


  • @Danh bearbeitete Frage, um den Unterschied zu erklären.

    – Tomas Andrle

    22. November 2016 um 10:42 Uhr

  • Ähnliche Frage: stackoverflow.com/questions/4866425/mixing-class-and-struct

    – Tomas Andrle

    22. November 2016 um 18:02 Uhr

Benutzer-Avatar
StoryTeller – Unslander Monica

struct und class sind in Bezug auf Vorwärtsdeklarationen vollständig austauschbar. Selbst für Definitionen wirken sie sich nur auf den Standardzugriffsbezeichner der Objektmitglieder aus, alles andere ist äquivalent. Sie definieren immer “Klassen” von Objekten.

Der einzige Ort, wo struct muss über verwendet werden classist beim Forward-Deklarieren von undurchsichtigen Daten für c-Bindungen.


Zu deiner Bearbeitung:

Ich kenne die Unterschiede zwischen Klasse/Struktur in Bezug auf die Standardeinstellung öffentlich/privat, aber ich frage speziell nach den Vorwärtsdeklarationen und möglichen Konsequenzen ihres Austauschs.

Visual C++ erzeugt eine Warnung C4099. Es tut es, weil die Namensdekoration für seine Funktionen das von Ihnen verwendete Schlüsselwort enthält. Daher Programme kann nicht richtig verlinken. Daher kann es sein, dass vollständig standardkonformer Code bei Verwendung von VC++ nicht verknüpft wird (ein dummer Schachzug von Microsoft, AFAIC).

Eine Diskussion dieser Warnung sowie warum sie ignoriert werden kann, wenn Sie diszipliniert sind, finden Sie hier hier

  • Danke für die Antwort. Für Seelenfrieden und um Compiler-Macken und mögliche zukünftige psychopathische Betreuer-Zorn zu vermeiden, werde ich alle Vorwärtserklärungen übereinstimmen lassen.

    – Tomas Andrle

    22. November 2016 um 18:12 Uhr

  • Dieses Verhalten habe ich für meine jetzige Aufgabe gebraucht. Ich muss eine Vorwärtsdeklaration für einen Typ vornehmen, der als Vorlagenparameter oder Makroparameter übergeben wird, aber der übergebene Typ kann eine Klasse oder eine Struktur sein.

    – Asse

    30. Oktober 2018 um 4:34 Uhr

  • Dies kann in der Tat zu Linker-Fehlern in VC++ führen. Siehe stackoverflow.com/questions/33483623/…

    – Andy Borell

    19. Mai 2021 um 18:36 Uhr


1012770cookie-checkForward-Deklaration als struct vs class

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy