Array beschreiben und auslesen

  • Hallo liebe Forengemeinde,

    vllt finde ich bei euch die benötigte Idee mein Problem umzusetzen, bisher erhalte ich nur mir unverständliche Fehler bei VS2008. Folgendes Problem ich möchte in ein Array einen neuen Spieler eintragen lassen und mir dieses Array dann wiederum auf der Konsolehttp://forum.chip.de/# ausgeben lassen, nur steh ich bei der Methodenprogrammierung etwas auf dem Schlauch. Vielen Dank für eure Mühe im Vorraus.

    Problemmethoden in CKader.cpp kommentiert:

  • Hmm, warum hat der Kader ein Gewicht, ein Geburtsdatum usw.??
    Also ich würde als erstes darauf verzichten, arrays aus Pointern zu verwenden, vorallem müssten es Pointer auf CSpieler und nicht auf int sein. ;)
    Benutz doch einen vector:
    In der Klasse:

    Code
    vector<CSpieler> spielerArray;


    Du kannst einen Vektor beliebig lang machen mit push_back:

    Code
    void CKader::AddSpieler() // void ist sinnvoll ;)
        {
            for(i = 0; i < cMaxSpieler; i++)
          {
              spielerArray.push_back(CSpieler());
          }
        }


    Einfacher wäre es im Konstruktor:

    Code
    CKader::CKader() : spielerArray(cMaxSpieler)
    {
    
    
    }


    Habe mir die Freiheit genommen, die Position und das Gewicht etc. zu entfernen, kannst du natürlich auch wieder einbauen.
    Anstelle von char*, bzw char[] solltest du strings benutzen:

    Code
    string vorname, nachname, geboren, aktVerein;


    Du solltest das keins Falls vergessen:

    C
    #include <vector>
    #include <string>


    Bool Rückgaben sind ziemlich blödsinnig, wenn es sowieso immer true ist, benutze lieber void als Rückgabewert und spar dir das return true;.
    Das mit dem Print ist eigentlich okay, es gibt allerdings noch eine praktischere Variante:


    Die hat einen praktischen Vorteil: Du kannst nun direkt cout << spieler aufrufen.
    Durch den Aufruf von cout << spieler wird diese Funktion dann mit cout als Parameter out aufgerufen, in das cout werden dann die Ausgaben geschrieben.
    Eine Zeile musst du dann allerdings in die Klasse CSpieler einfügen:

    Code
    friend ostream& operator<<(ostream&, CSpieler);


    Das bewirkt, dass die Ausgabe-Funktion auf die privaten Elemente zugreifen darf.
    Noch ein Denkanstoß:
    Soll aktVerein wirklich nur eine Zeichenkette sein, oder lieber ein Zeiger auf einen Verein (ist CKader ein Verein, muss da eben stehen CKader* aktVerein, bei CVerein eben entsprechendes...).

    Es ist sehr schön, dass du die tolle Objektorientierung aus C++ verwendest, allerdings nimm es als allgeminen Ratschlag, in nicht Hardware-nahen Sachen, auf char*, arrays und übermäßig viele Pointer zu verzichten. Das bringt nur Probleme mit sich, Alternativen sind eben strings und vectoren.

    Viele liebe Grüße
    The User

    PS:
    Schonmal code::Blocks probiert?

  • Erstmal danke schön und es hat geholfen. Leider verlangt es meine diese unnützen Bool-Rückgaben zu verwenden, da ich sie auch nicht für sehr sinnig halte. Zum Thema Objektorientierung, ich komme aus der Javaecke ;D

  • Wer ist denn "meine"??
    Also false würde ich vielleicht zurückgeben, wenn ein Fehlerfall halbwegs wahrscheinlich ist, z. B. wenn man eine Datei einlesen möchte und die Datei nicht existiert oder so. Aber wenn das wirklich eine Ausnahme ist, würde ich auch zur Ausnahmenbehandlung greifen. Die kommen ja von C++, übrigens kannst du in C++ alle Datentypen werfern, sie müssen nicht throwable sein, das throws kann man sich auch sparen, möchte man es dennoch haben, geht es so:

    Code
    void fehlerAnfaelligeFunktion() : throw(exception, runtime_error, bool, my_exception);

    Ich komme von C++ und benutze ab und an Java, du wirst bestimmt auch noch tolle Sachen in C++ kennenlernen, die in Java nicht gehen. ;)