Klassendefinition



  • Guten Tag liebe Leute!
    Ich stehe bei folgender Aufgabe so richtig auf dem Schlauch und wäre froh wenn mich jemand unterstützen kann:
    Folgende Ausdrücke sind in der Main- Funktion gegeben, dazu sollen entsprechend Klassen definiert werden, damit die Übersetzung fehlerfrei läuft:

    int main(){
    A a (1.0); // das leuchtet mir ja noch ein..
    B b (a);
    a.i = b.f () + a;
    b.j = a.g ();
    a=-b;
    return 0;
    }

    Die Zeilen 2-5 sind für mich ein Rätsel 😞
    Danke vorab für Eure Hilfe



  • Das sind alles Grundlagen. Was genau erwartest du jetzt von uns?



  • @Hansi_98 sagte in Klassendefinition:

    A a (1.0); // das leuchtet mir ja noch ein..

    Du brauchst also eine Klasse A, die im Konstruktor einen double-Wert entgegennimmt.

    B b (a);

    Du brauchst also eine Klasse B, die im Konstruktor einen A-Wert entgegennimmt.

    a.i = b.f () + a;

    Die Klasse A hat also eine public member Variable i, die Klasse B hat also eine public-Funktion f, die keine Argumente hat und etwas zurückliefert, zu dem man ein A addieren kann.

    a=-b;

    Es gibt also den unären operator- für B. Und dessen Rückgabewert passt in den operator= von A rein.

    Es gibt definitiv mehrere korrekte Lösungen, denn es ist ja nirgends vorgegeben, was für Typen a.i, b.j, b.f() etc jeweils sind. Aber versuch's doch erst mal mit möglichst einfachen Typen wie int und werde komplizierter, wenn nötig.



  • @Hansi_98 sagte in Klassendefinition:

    A a (1.0);   // das leuchtet mir ja noch ein..
    B b (a);
    

    Die zweite Zeile ist fast dasselbe wie die erste Zeile, nur dass hier mit einer Variable a anstatt mit einem direkten Wert (Literal) initialisiert wird. B benötigt hier also entweder einen Konstruktor, der ein A entgegennimmt, oder eine Instanz von A muss implizit in einen Typen konvertierbar sein, den ein Konstruktor von B akzeptiert.

    a.i = b.f () + a;
    

    Mit dem Punkt . (-Operator) greift man auf einen Member zu. Das kann entweder eine Variable (Member-Variable oder data member) oder eine Member-Funktion sein (auch Methode genannt, eher in anderen Sprachen). a.i scheint hier eine Member-Variable zu sein und b.f wegen den Klammern eine Member-Funktion. Damit die Addition mit a funktioniert, musst du entweder einen operator+ definieren, der links den Typen akzeptiert, der von b.f zurückgegeben wird und rechts ein A, oder du machst A implizit konvertierbar in den von b.f zurückgegebenen Typen, so dass du von einem bereits vorhandenen +-Operator für Builtin-Typen (wie int, double, etc.) profitieren kannst.

    b.j = a.g ();

    Wie die vorherige Zeile, nur ohne +-Operator-Gedöns.

    a=-b;

    Damit dieser Ausdruck funktioniert, benötigt die Klasse A einen operator-=, der ein B, oder einen Typen, in den B implizit konvertierbar ist, entgegennimmt.

    Ich hab hier ein paar Stichworte gegeben. Lies dich mal ein, wie man das macht - das sollte auf Basis der o.g. Information hinzubekommen sein. Ansonsten frag nochmal nach, wenn du eine konkrete Frage hast 😉



  • @Finnegan sagte in Klassendefinition:

    a=-b;

    Damit dieser Ausdruck funktioniert, benötigt die Klasse A einen operator-=

    Was? Interpretieren neuerdings Compiler =- nach -= um? Solange das nicht der Fall ist, würde ich bei meiner Interpretation bleiben (s.o.).



  • @wob sagte in Klassendefinition:

    @Finnegan sagte in Klassendefinition:

    a=-b;

    Damit dieser Ausdruck funktioniert, benötigt die Klasse A einen operator-=

    Was? Interpretieren neuerdings Compiler =- nach -= um? Solange das nicht der Fall ist, würde ich bei meiner Interpretation bleiben (s.o.).

    Ne. War ne Verpeilung meinerseits. Ein guter Grund mit Leerzeichen nicht zu sehr zu knausern -> a = -b 😉



  • @Finnegan sagte in Klassendefinition:

    Ein guter Grund mit Leerzeichen nicht zu sehr zu knausern

    Das kann ich nur unterstützen! 👏 Alternativ die Leerzeichen automatisch von einem Code-Formatierer einsetzen lassen.



  • Herzlichen Dank liebe Leute! Ihr habt mir sehr gute Denkanstösse gegeben 🙂