vector in Klasse?



  • class EineKlasse
    {
    public:
      EineKlasse() : einVector(10)
      {
         std::fill(einVector.begin(), einVector.end(), 0);
      }
    
      int operator[](size_t pos) const
      {
        return einVector.at(pos);
      }
    private:
      std::vector<int> einVector;
    };
    


  • Kannst du mir erklären, wie man einen Apfel auf einer Bergwanderung benutzt? Wenn dir die Frage komisch vorkommt, lies dir deine nochmal durch und versuch es besser zu machen :p



  • Bravo brotbernd, ganz intelligent...



  • Es ist ein vector in einer Klasse und es kommt fill und at vor. Was war denn sonst gemeint.



  • Kóyaánasqatsi schrieb:

    Bravo brotbernd, ganz intelligent...

    Was hast du daran auszusetzen? Er kapselt einen int-vector weg, der Benutzer kann weder den Wert (EineKlasse::operator[] liefert eine Kopie und keine Referenz) noch den vector (->private) verändern - perfekt!



  • Es ging mir darum das der Threadersteller selber was probiert. Das hier ist ein Forum und kein HausaufgabenMachBoard.



  • Das war ja auch keine Hausaufgabe, sondern lediglich die Bitte nach einem Beispiel um ihm verstehen zu helfen.
    Also immer langsam mit den jungen Pferden, Sherrif.



  • Also wirklich. Vielen Dank brotbernd. Aus dem Alter, das ich Hausaufgaben machen muss, bin ich raus. Ich könnte dem Betreffenden aber genauso gut Postingschinderei vorwerfen, denn nützlich sind solche Beiträge wahrhaft nicht.

    Ich komm auf das Beispiel später noch mal zurück, denn ich muss erst was nachschauen.



  • Ich hatte mir das so vorgestellt, das die Klasse ein Schiff beschreibt, mit Länge und Koordinaten. Diese Koordinaten sollen in einen zweidimensionalen vector.
    Von der Klasse leite ich mehrere Unterklassen ab, so das jedes Schiff seine Eigenschaften hat. Haben tue ich schon dieses:

    class cShip{
    
    private:
        int length;
    
    public:
    
         void setShiplength();
         int getShiplength();
        //hier wollte ich den vector schreiben
    
    };
    
    void cShip::setShiplength(int l){
        length=l;
    }
    int cShip::getShiplength(){
        return length;
    }
    
    int main(){
    
        cShip cTraeger, cZerstoerer, cKreuzer;
        cTraeger.setShiplength(6);
    
        //hiermit weiterarbeiten
        cTraeger.getShiplength();
    
    }
    

    Ich will also mit dem vector weiterarbeiten, der sich auf die verschiedenen Schiffsklassen bezieht.


  • Mod

    lemon03 schrieb:

    ...

    Ist das eine Frage? Wenn ja, welche?



  • Sorry. Ich würde gerne wissen, ob und wie ich mit dem vector analog zu cTraeger.getShiplength() weiterarbeiten kann.

    Der vector soll in der cShip deklariert werden, aber für cTraeger, cZerstoerer, cKreuzer verschiedene Inhalte haben.


  • Mod

    vectoren verhalten sich genauso wie alle anderen Objekte. Also geht das 100% analog zu dem was du mit length machst. Was du allerdings schlecht und falsch machst, aber das schiebe ich mal darauf, dass du dein Beispiel gerade hier im Editor geschrieben hast, ohne es zu kontrollieren.



  • Warum sollen die Lagekoordinaten EINES Schiffes in einen vector? Ein vector ist dazu da, mehrere Objekte gleichen Typs in einem Objekt zu sammeln. Ein Schiff hat aber nur eine Koordinate.

    Willst du ein Schiffe versenken programmieren? Wenn ja: leite nicht extra für einen anderen Schiffstyp ab, Polymorphie hat hier keinen Sinn. Ein Kreuzer und ein Zerstörer unterscheiden sich nur in der Länge. Wenn es Schiffe versenken werden soll, sag Bescheid, dann schreib ich etwas mehr 🙂



  • Ja, es soll ein 'Schiffe versenken' für die Konsole werden 😃

    Mein Plan ist, ein Schiff durch zB [20][10]=1 bis (entsprechend der Länge) [25][10]=1 zu beschreiben. Dann brauche ich bei einem Angriff nur zu fragen, ob die Zielkoordinate true ist.

    Damit ich aber im Programm mitteilen kann, welches Schiff gerade getroffen wurde, wollte ich die Koordinaten personalisieren. Meine erste Idee war, einen vector für jedes Schiff zu erstellen. Dann dachte ich aber, das man es mit einer Klasse vielleicht besser lösen könnte.


  • Mod

    Darf ich vorschlagen, dass du stattdessen die Koordinaten nicht Teil des Schiffes machst, sondern dir stattdessen irgendwo anders merkst, ob ein Feld besetzt ist und wenn ja, von welchem Schiff?



  • SeppJ schrieb:

    aber das schiebe ich mal darauf, dass du dein Beispiel gerade hier im Editor geschrieben hast, ohne es zu kontrollieren.

    Ja, das habe ich mit meinem Minimalwissen so getippt, wie ich es mir ungefähr vorstelle, ohne den Code überprüft zu haben.



  • SeppJ schrieb:

    Darf ich vorschlagen, dass du stattdessen die Koordinaten nicht Teil des Schiffes machst, sondern dir stattdessen irgendwo anders merkst, ob ein Feld besetzt ist und wenn ja, von welchem Schiff?

    Ich bin nicht unbedingt der hellste Coder und dementsprechend ist mein Abstraktionsvermögen etwas eingeschränkt. Kannst Du mir vielleicht einen kleinen Hinweis geben, was Dir vorschwebt? Ich habe schon so viele Alternativen durchdacht, das mir kaum noch was einfällt.

    Das Problem ist ja auch beim Schiffe setzen, das da man da Rücksicht auf die schon gesetzten Schiffe nehmen muss.



  • Was hältst du von folgendem Ansatz?

    #include <iostream>
    
    // Ist das Feld belegt? Wenn ja was für ein Schiffstyp?
    enum FeldTyp
    {
    	Kreuzer,
    	Traeger,
    	Zerstoerer,
    
    	Unbelegt
    };
    
    // Welchem Spieler gehört das Feld?
    enum Spieler
    {
    	Spieler1,
    	Spieler2
    };
    
    // Ein Feld beschreibt also den Typ des Feldes und wem es gehört.
    struct FeldInfo
    {
    	FeldTyp typ;
    	Spieler spieler;
    };
    
    // So könnte das Feld aussehen
    FeldInfo Feld[10][10];
    

    Sollte ein Schiff dann aus mehreren Feldern bestehen, dann setzt du einfach mehrere Felder für diesen Spieler. Dieser Ansatz hat natürlich bei einer richtigen grafischen Darstellung einige Nachteile, aber für den Anfang sollte das ausreichen.


  • Mod

    FaxXer schrieb:

    Ich will nur zur Übung die Informationen aus einer ausführbaren Datei lesen. Hmm ja hab mir gedacht wenn ichs so mach ist der Lernanteil wesentlich höher. Deswegen verzicht ich erstmal auf den schnelleren weg.
    Gruß

    Ganz grob so:

    class ship
    {
      // Länge, Typ, wie oft getroffen. Was man eben so braucht
    };
    
    // ...
    
    vector<vector<ship*> > spielfeld(10, vector<ship*>(10, 0)); // 10x10 Feld mit 0 initialisiert
    vector<ship> schiffe(5); // Konkrete Schiffsobjekte, es ist sicherlich später mal nützlich diese direkt zugreifbar zu haben.
    

    Jetzt setzt du bei deinem spielfeld entsprechend die Zeiger auf die Objekte in schiffe , eben an den Stellen wo ein gewisses Schiff liegt. Und wenn auf ein Feld geschossen wird, rufst du die entsprechende Funktion von dem Objekt auf, auf das da gezeigt wird.

    Man könnte sich noch überlegen anstatt der Nullzeiger noch eine Klasse wasser zu erstellen und ship und wasser beide von einer gemeinsamen Basisklasse beschiessbares_objekt abzueleiten, aber ich denke mal, Polymophie ist für diese Aufgabenstellung unnötig kompliziert.



  • Vielen Dank erstmal. Ich muss natürlich sagen, das ich gegen den Computer spielen will. Ein Spiel Spieler vs Spieler über Netzwerk etc ist mir doch einiges zu hoch.

    Wie gesagt, mit Klassen habe ich mich erst seit gestern beschäftigt, da fehlt mir einfach die Routine und das Wissen, das ich sie einsetzen kann ohne konkrete Beispiele. Aber es geht ja auch ohne, ich dachte nur, das wäre ne gute Möglichkeit sich mal damit zu beschäftigen.

    Aber trotzdem danke für die bisherigen Beispiele, ich schau mal, wie ich sie umsetzen kann 😉


Anmelden zum Antworten