Verwendung Objekt einer Klasse in anderer Klasse ohne Vererbung



  • Eine Frage bezüglich Klassen in C++....
    Wie kann ich ein Objekt von Klasse A in Klasse B und in Funktionen als Parameter verwenden ohne Vererbung?

    class A{
    public:
    int m;
    A(int mm){m = mm;}
    };
    class B{
    public:
    B(){}
    int plus(A a){
    return a.m++;}
    };
    


  • Kannst du deine Frage präzisieren? Du verwendest doch schon in B::plus einen Parameter, der ein A-Objekt erwartet. Was ist dein Ziel? Und was hat das mit Vererbung zu tun?

    Das retutn a.m++; hat gleich 2 Fehler: einmal sollte es wohl return heißen - und das ++ bringt dir gar nichts - es arbeitet auf einer Kopie, die verworfen wird. Meintest du return a.m + 1;?



  • @wob das code hier funktioniert nicht
    dieser Code ist nur beispiel da ich an größe Programm arbeite.
    hier ist der Fehler bei mir
    Kreis_Ring ist eine Funktion von Klasse A und *po ein Pointer von der Klass B, hier ghet es um Polymorphie aber der Fehler ist dass 'Poly' has not been declared
    void Kreis_Ring(Poly *po, vector<Operations> v)
    ^~~~

    void Kreis_Ring(Poly *po, vector<Operations> v)
    


  • Dann mußt du die passende Headerdatei (z.B. "poly.h") dazu mittels #include einbinden.

    In Headerdateien (d.h. für die Deklaration der Funktion) reicht auch eine Vorwärtsreferenz: class Poly;


  • Mod

    @Feras sagte in Verwendung Objekt einer Klasse in anderer Klasse ohne Vererbung:

    Kreis_Ring ist eine Funktion von Klasse A und *po ein Pointer von der Klass B, hier ghet es um Polymorphie aber der Fehler ist dass 'Poly' has not been declared
    void Kreis_Ring(Poly *po, vector<Operations> v)
    ^~~~

    void Kreis_Ring(Poly *po, vector<Operations> v)
    

    Das ist ja eine völlig andere Frage, nämlich wieso du an der Stelle diesen Compilierfehler bekommst. Um das mit Sicherheit zu beantworten bräuchte man ein vollständiges Minimalbeispiel, das des Fehler reproduziert. Mein Tipp ist aber, dass du da zirkuläre Imports hast. Kommt vor dieser Deklaration zufällig etwas, das die Klasse Poly importiert? Und das wo die Klasse Poly definiert wird, hat wieder etwas drin, das dieses Codestück importiert? In dem Fall würde man das dadurch aufbrechen, dass man für einen Pointer gar keine vollständige Klassendefiniton braucht, sondern ein einfaches class Poly; irgendwo vorher reicht aus. Sogenannte 'forward declaration'.



  • @Th69 ich habe es hinzugeschrieben geht nicht
    mit "#include"



  • @SeppJ sagte in Verwendung Objekt einer Klasse in anderer Klasse ohne Vererbung:

    zirkuläre

    class poly ist zuerst deklariert und importiert mit dem Headerdatei also includiert ich habe es versucht die beide classes als friends zu implementieren aber geht auch nicht 😤



  • Was genau hast du wo hingeschrieben? Oder paßt das, was SeppJ geschrieben hat, daß du zirkuläre Abhängigkeiten hast (also gegenseitige #include-Anweisungen in den Headerdateien)?





  • @SeppJ was meinst du mit zirkuläre Imports?


  • Mod

    @Feras sagte in Verwendung Objekt einer Klasse in anderer Klasse ohne Vererbung:

    @SeppJ was meinst du mit zirkuläre Imports?

    Das ist buchstäblich in dem Beitrag erklärt, wo ich es - nun - erkläre.



  • Hallo @Feras,
    Ganz einfach; Header-Datei von Klasse X (x.h) bindet Header-Datei von Klasse Y (y.h) mit (#include "y.h") ein, weil z.B. Klasse X eine Unterklasse von Klasse Y ist oder darauf anderweitig referenziert.
    Nun hat aber hat die Header-Datei von Klasse Y aus irgendeinem Grund auch das Bedürfnis von Klasse X zu wissen. Wenn jetzt in der Header-Datei von Klasse Y eine "#include "x.h" vorgenommen wird, spricht man von zirkuläre Abhängigkeiten.

    Was passiert? Der Kompiler "ließt" eine Header-Datei, z.B. "x.h". Bevor er etwas von Klasse X mitbekommt, ließt er das dortige #include "y.h". Dort findet er vor der Klassendeklaration von Klasse Y ein #include "x.h", also ließt der Kompiler die Header-Datei von Klasse X ein und findet…. Oh mir schwirrt schon der Kopf.

    Lösung in vielen Fällen; wo es geht, im Header abhängige Klassen als friend deklarieren und in der Source-Datei mit #include einbinden.

    Edit: Oh, ein Fehler meinerseits, bitte Nicht friend (war schon spät)!
    Mach es wie @SeppJ gesagt hat. Tausche friend in, Zitat: "ein einfaches class Poly; irgendwo vorher reicht aus. Sogenannte 'forward declaration'."


Log in to reply