kostenloser Webspace werbefrei: lima-city


Habe gerade mit C++ angefangen

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    nashor

    nashor hat kostenlosen Webspace.

    Hi,

    ich habe gerade mit C++ angefangen und schon die ersten Fragen:

    Nehmen wir uns folgenden Quellcode vor:

    #include <iostream>
    using namespace std;
    
    class Fighter {
          private:
                  int LP,AP,AttackChance,DefendChance;
                  char Name,Damage;      
          public:
                 int getLP();  
                 int setLP(int newLP);           
    };
    
    
    
    int Fighter::getLP() {
        cout << LP;
        return LP;        
    }
    
    int Fighter::setLP(int newLP) {
        LP = newLP;
        return 0;
    }
    
        
        
    int main() {
        Fighter Test;
        Test.setLP(10);
        Test.getLP();
        system("PAUSE");
              
    }


    1. Es steht ein ; hinter der Definition der Klasse Fighter. Ich verstehe, dass ein Semikolon immer am Ende des Codes vorkommen muss, damit der Compiler weiß, dass hier jetzt sämtliche Anweisungen des Programmierers enden (richtig oder?), aber ich habe in manchen Codebeispielen gesehen, dass es direkt hinter die Klassendefinition gesetzt wurde. Was ist richtig? Ist das egal? Ich würde es eigentlich ganz ans Ende des Programmes setzen, damit das ganze schön übersichtlich ist und nicht irgendwo mittenrein...

    2. In Fighter::getLP() muss nur LP geschrieben werden, um auf die LP des Kämpfers zuzugreifen. Ist das so, weil die beiden Doppelpunkte besagen, dass getLP() zu Fighter gehört und der Compiler sofort weiß, dass ich, wenn ich LP innerhalb von getLP() benutze, einfach die LP, die als private definiert wurden, meine? Ich habe nun bei setLP() deswegen die Variable newLP benutzt, damit man nicht newLP und LP durcheinander bringt. Richtig oder?

    3. Muss ich in jeder Funktion einen return Wert haben? (bei getLP lasse ich die LP per cout ausgeben, später möchte ich einfach nur das ganze per return zum Weiterverarbeiten zurück geben - bei setLP habe ich aber nichts zum zurückgeben, deswegen frage ich mich, ob ich da wirklich return 0; hinschreiben muss).

    Vielen Dank erstmal,
    Nashor
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hi,

    zu 1. das Semikolon muss ans Ende jeder Klasse, dass ist im Endeffekt ein relikt von C (C++ Klassen sind nur erweiterte structs (gewesen))
    Das Semikolon muss nur hinter jeden Befehl, nicht an das Ende des Quellcodes. Das hängt damit zusammen, dass Zeilenumbrüche, Tabs etc. "nur" zur Leserlichkeit des Programms beitragen und beim Compilieren nicht beachtet werden.
    So könnte die Eindeutigkeit eines Befehls sonst verloren gehen.

    zu 2. der :: ist der sogenante scope-Operator (http://webcache.googleusercontent.com/search?q=cache:6yvVH9xfVY8J:www.nebel.de/kurse/C%2B%2B/Scope-Operator%28%29.html+scope+Operator&cd=1&hl=de&ct=clnk&gl=de), und er gibt an das sich getLP im namespace der Klasse Fighter befindet. (Also, ja es wird eine Zugehörigkeit ausgedrückt.)
    Das mit newLP ist möglich, ja. Ich persönlich bevorzuge aber folgende Variante:
    void Fighter::setLP(int LP) {
        this->LP = LP;
        return; // <- muss nicht sein
    }

    Das neue LP verdeckt das alte und das alte muss dann mit Fighter::LP angegeben werden.
    Der Vorteil ist, dass newLP auch ein LP sein kann das durch eine Berechnung inerhalb der Funktion entsanden ist.
    Also newLP = LP1 + LP2. Mit meiner Variante ist aber klar: das die LP soll Fighter::LP entsprechen.
    Das muss du nicht machen, aber ich finde es sprechender und glaub mir ein ordentlicher Source ist bei längeren Programmen einfach ein Segen (auch für Leute die deinen Source warten müssen).

    zu 3. wenn du ein void zurückgibst kannst du auf return verzichten. Möchtest du eine Funktion trotzdem vorzeitig verlassen, die void als Rückgabewert besitzt schreibst du einfach
    return;
    
    // Beispiel
    void HalloWelt()
    {
        int i = 0;
        ++i;
        return;
        ++i; // Diese Anweisung wird nicht mehr ausgeführt.
    }

    Das return ist nicht mehr nötig am Ende der Funktion (ich bin aber der Meinung das es ein guter Stil ist das return trotzdem zu schreiben)

    p.s. ein Programm endet mit der letzten Anweisung in der Methode main() und diese sollte
    return 0;

    sein. Der Wert 0 gibt dem Betriebsystem an das dass Programm ohne Fehler beendet wurde.

    edit: Wenn du die Themenbeschreibung besser formulierst bekommst du von mehr Leuten Hilfe ;)
    edit2: du solltest dir mal angucken was Module sind wenn du mit Klassen arbeitest.

    Beitrag zuletzt geändert: 17.9.2010 18:19:31 von denkeriment
  4. Kleine Anmerkung noch zu 2.:

    this->LP = LP;
    anstelle von
    Fighter::LP = LP;


    Der this-Zeiger ist sowieso immer ganz praktisch bei solchen Dingen. Ich weiß nicht, ob Fighter::LP = LP wirklich das tut, was es tun sollte... Ich kenne diese Verwendung eher bei statischen Methoden oder Attributen, die so von anderen Klassen aus aufgerufen werden können. Die Variable LP ist keine statische Variable.

  5. this->LP = LP;

    meinte ich doch. Ich weiß auch nicht wie ich auf
    Fighter::LP = LP;

    komme *edit*
  6. Autor dieses Themas

    nashor

    nashor hat kostenlosen Webspace.

    Hallo,

    nachdem ich den letzen Monat keine Zeit hatte wegen der Schule, möchte ich nun mit C++ weitermachen und habe diesen alten Thread wieder gefunden. Erstmal danke für eure Antworten.

    void Fighter::setLP(int LP) {
    this->LP = LP;
    return; // <- muss nicht sein
    }


    1. Du bevorzugst diese Variante - warum habe ich verstanden. Ich hab auch verstanden, dass das this->LP ausdrückt, dass das LP von Fighter angesprochen werden soll. Was mich hier aber verwirrt ist die Tatsache, dass der Namensraum LP innerhalb der Funktion setLP sozusagen doppelt belegt ist. Würde LP nicht als Parameter von setLP aufgezeigt sein, würde ich mit LP ja direkt die LP von Fighter ansprechen und nicht den Parameter selber. Was passiert in solchen Fällen, wenn sich zwei Variablennamen unterscheiden und ist das der einzige Grund warum dann dieser Zeigeroperator verwendet wird?

    2. Ok, da wo ich nichts zurückgeben muss, kann ich ein return; also weglassen, auch wenn es der Lesbarkeit und Vollständigkeit halber hinzugehören hätte. Richtig?

    3. Du sagtest ich solle mir Module angucken, wenn ich Klassen arbeite. Habe ich getan nur verstehe ich das irgendwie noch nicht ganz. Wieso sollte ich denn z.B. meinen kleinen Quellcode von oben in mehrere Teile aufteilen, wenn er eh schon enorm übersichtlich ist? Btw: Ich hab auch mehrfach gelesen ich solle sowas in eine .cpp und eine .h aufteilen wobei ich auch nicht verstehe warum ich das soll, wenn es doch recht übersichtlich so ist.

    Danke :)
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!