previous definition of 'class

  • C++/CLI

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Elanda.

    previous definition of 'class

    Hallo Leute und danke für's reinschauen.

    ich bin kein Experte für C++. Daher komme ich hier nicht weiter. Mein Problem:

    Ich habe eine Klasse A, Klasse B und Klasse C. Klasse A soll an Klasse B und C als Referenz übergeben werden. Ungefähr so ist meine Deklaration (Abstrakt):

    Klasse B:
    private:
    Klasse A* klasse;

    Genau gleich in der Klasse C:
    Klasse C:
    private:
    Klasse A* klasse;

    Jetzt klappt es super mit der Übergabe an Klasse B. Sobald ich aber in die Klasse C (in die Header-Datei) reinschreibe #include <Klasse A.h> zeigt mir der Compiler: previous definition of 'Klasse A'

    Kann mir jemand helfen?

    Danke im Voraus

    EugenIS schrieb:

    Kann mir jemand helfen?
    Da sind zwei gleiche Includes versammelt.
    Pobierma als erste Zeile in jedem Header

    C-Quellcode

    1. #pragma once
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @EugenIS

    RodFromGermany schrieb:

    Pobierma als erste Zeile in jedem Header
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    EugenIS schrieb:

    Er kennt "once" nicht...
    Das geht dann so,
    Du musst nur aufpassen, dass das Define einmalig in Deinem Projekt ist.
    Beispiel:

    C-Quellcode: Cell.h

    1. #ifndef __CELL_H__
    2. #define __CELL_H__
    3. // Dein Header
    4. #endif // #ifndef __CELL_H__
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Nur als Tipp, du benötigst die Header includes gar nicht wenn du nur einen Pointer oder eine Referenz zu einer Klasse hast.
    Du kannst dann sogenannte "forward declaring" machen, somit gibst du dem Compiler bescheid das die Klasse existiert, er wird aber nichts über die Klasse Wissen. (Struktur, Größe)

    Um dafür zu kompensieren wird dann in der source Datei (source ist hier umgangssprachlich für deine .cpp datei), der tatsächliche Header inkludiert.
    Merke aber das dies nur möglich ist wenn sich Deklaration und Definition in unterschiedlichen Dateien befinden!

    Eine forward Deklaration sieht so aus:

    C-Quellcode

    1. class MyClass;

    Das is it.
    Du kannst auf die Klasse im Header jetzt zwar nicht zugreifen, jedoch kannst du sie als Zeiger oder Referenztype deklarieren, denn der Kompilierer braucht nicht mehr als das, solange der eigentliche Header vor der Definition bereit steht.

    Übrigens, es ist sehr unwarscheinlich das

    C-Quellcode

    1. #pragma once
    nicht funktioniert.
    Es ist zwar nicht standard, aber alle Hauptkompilierer verfügen darüber, es sei denn du verwendest irgend einen exotischen Kompilierer.
    Hier ist eine Support-Liste:
    en.wikipedia.org/wiki/Pragma_once
    ----------------------------------------------------------------------------------------------------------------------

    Hier könnte meine Signatur stehen, aber die ist mir abfußen gekommen.

    ----------------------------------------------------------------------------------------------------------------------