Fehlersuche



  • Hallo alles zusammen,

    ich habe hier eine "einfache" aufgabe in der ich nun fehler suchen soll. ich weis das hier keine hausaufgaben von anderen gemacht werden also ich habe mich schon selbst damit befasst:

    #include <iostream>

    class A
    {
    private:

    int x;
    };

    int main()
    {
    A a;
    std::cout << a.x << std::endl;
    }

    folgende fehler sind meiner meinung nach in diesm code:

    - die klasse kommt nicht in die .cpp datei sondern wird in einer header .h datei deklariert.

    - der public teil fehlt

    -in der main fkt muss A::a stehen statt A a
    -und in der konsole soll etwas aus der privaten klasse ausgegeben werden was aber nur die öffentliche klasse die "rechte" dazu hat.

    freue mich, auch auf kleinestem c++ niveau gleichgesinnte zu finden und bin über jeden ratschlag happy 🙂

    mfg, 1nfinity



  • Infinity schrieb:

    und in der konsole soll etwas aus der privaten klasse ausgegeben werden was aber nur die öffentliche klasse die "rechte" dazu hat.

    Richtig, was auch immer mit öffentlicher Klasse gemeint ist.

    die Variable x ist nach außen hin nicht sichtbar. Das sagt schon das private aus.
    Drum kannst du in der main-Funktion nicht mit a.x direkt darauf zugreifen.

    Diese Zeile ist somit falsch:
    std::cout << a.x << std::endl;



  • 1nfinity schrieb:

    folgende fehler sind meiner meinung nach in diesm code:

    - die klasse kommt nicht in die .cpp datei sondern wird in einer header .h datei deklariert.

    Kein Fehler, nur Konvention.

    1nfinity schrieb:

    - der public teil fehlt

    Kein Fehler, soweit.

    1nfinity schrieb:

    -in der main fkt muss A::a stehen statt A a

    Warum? Was tun beide Varianten?

    MfG



  • Du könntest eine get Methode schreiben, die public ist. Diese macht nichts anderes, als das private Attribut zurückzugeben. Außerdem gilt in C++ Groß- und Kleinschreibung. Deswegen muss "A" geschrieben werden und nicht "a".

    lg, freakC++



  • Richtig, was auch immer mit öffentlicher Klasse gemeint ist.

    ich meinte public: 🙂

    Kein Fehler, nur Konvention.

    was heißt konvention in diesem fall?

    Warum? Was tun beide Varianten?

    MfG

    also bei der definition einer methode muss auch der klassenname angegeben werden. und der wird vom funktionsnamen durch den bereichsoperator :: getrennt

    aber eigentlich hab ich doch gar keine methode, weil keine public deklariert wurde. oder steh ich grad auf dem schlauch?



  • 1nfinity schrieb:

    Kein Fehler, nur Konvention.

    was heißt konvention in diesem fall?

    Man tut es halt. Es ist einfacher, ein Projekt bestehend aus mehreren Klassen zu kompilieren, wenn die Deklarationen in Header-Dateien stehen. So kann eine andere Klasse, die Dinge aus deiner Klasse benötigt, die Header-Datei einbinden und kann damit arbeiten, ohne schon den gesamten Code einzubinden.
    Uff, ich bin erstaunlich müde gerade. Ich hoffe, das passt so als Erklärung. 🙂

    1nfinity schrieb:

    Warum? Was tun beide Varianten?

    also bei der definition einer methode muss auch der klassenname angegeben werden. und der wird vom funktionsnamen durch den bereichsoperator :: getrennt

    aber eigentlich hab ich doch gar keine methode, weil keine public deklariert wurde. oder steh ich grad auf dem schlauch?

    "A a;" ist nichts anderes als "string foo;" oder "int i;"
    Du deklarierst damit eine Variable "a" vom Typ "A".

    Was du meinst, ist die Definition einer Funktion. Also, wenn du z. B. eine Funktion getA() in deiner Klasse hättest, müsstest du die so implementieren:

    int A::a()
    {
        return a;
    }
    

    MfG



  • ja so meinte ich das.
    aha.verstehe!
    ok dann ist das also eine konvention und kein fehler. wieder dazu gelernt. für einen müden mann machst du aber noch einen hellen eindruck 🙂

    vielen dank für den support! tolles forum

    bis bald!!

    mfg, 1nfinity



  • hello again,

    also ich setze meine aufgabe hiermit heute fort.vlt sollte ich an deiser stelle die aufgabenstellung mal angeben:

    #include <iostream>
    
    class A
    {
    private:
    	int x;
    };
    
    int main()
    {
    	A a;
    	std::cout << a.x << std::endl;
    }
    

    1. beschreiben sie alle fehler die von c++-compiler erkannt werden
    2. fügen sie für alle fehler an der richtigen stelle im code ihren vorschlag für eine korrekktr ein dabei dürfen sie die deklaration der variablen nicht verändern.

    also meine fehleranalyse lautet:

    -class in .h datei konventionell
    -in der main fkt wird x aus private geholt was nciht geht.

    ok in visual studio den code eingegeben und debugged ergibt sich ein fehler den ich nun beheben muss.

    VS Fehlerausgabe:
    ""A::x": Kein Zugriff auf private Member, dessen Deklaration in der A-Klasse erfolgte."

    ok kan ich nachvollziehen, da x private ist.

    mein problem zu aufgabe 2 lautet nun:
    ich soll also die zeile verändern ohne die deklaration der variablen zu ändern.

    ich verstehe noch nciht genau was dieser kleine code überhaupt aussagt?
    also es wird eine classe A deklariert und eine variable x vom typ int .
    dann in der main fkt wird wieder eine variable a vom typ A deklariert.ich verstehe aber den sinn nicht genau.
    daher weis ich auch nicht direkt wie ich die zeile nun verändern muss.

    ich bräuchte hilfestellung und freue mich auf jeden support

    mfg



  • Eine Klasse kapselt Daten zu einem bestimmten Objekt und Funktionen, die mit diesen Daten arbeiten.

    class A
    {
    private:
        int x;
    };
    

    Willst du mit einer Klasse arbeiten, so musst du von dieser eine Instanz erstellen

    A a;
    

    a kann nun in dem Fall auf alle Eigenschaften und Funktionen deiner Klasse zugreifen, die public sind. (davon hast du derzeit ja noch keine)

    Drum als Lösungsansatz

    freakC++ schrieb:

    Du könntest eine get Methode schreiben, die public ist. Diese macht nichts anderes, als das private Attribut zurückzugeben.

    und diese Zeile dann entsprehend anpassen

    std::cout << a.x << std::endl;
    

Anmelden zum Antworten