Arbeiten mit Klassen im Heap?



  • pShip soll Ship* sein.

    Warum verwendest du einmal (*pShip[Poi * Poj]). (richtig) und einmal ((*pShip)[Poi * Poj]). (falsch)? Statt (*pShip). kannst du auch pShip-> schreiben.



  • Der Fehler bezieht sich nur auf die Zeile 18. Also wie soll ich die Zeile 18 umschreiben. Der Rest Funktioniert schon so.
    Ich hab auch schon versucht Zeile 18 so zu schreiben:
    Ship* pShip = new Ship[16];
    Doch dann gibt er mir folgenden Fehler aus:
    Ship[int] for Array substrict:
    Mit dieser bezeichnung weiß ich überhaupt nichts anzufangen!
    Also könnt ihr mir Helfen ohne dass ich den gesamten Text verändern muss?



  • Woher willst du wissen, ob der Rest funktioniert, wenn du's nicht einmal compilieren kannst?

    EDIT: Ship* pShip = new Ship[16]; // Das sollte keinen Fehler machen



  • Das war so gemeint, dass mir der Kompiler keinen weiteren Fehler ausgibt.



  • Also bei mir compiliert das hier ohne Probleme:

    class Ship
    {
      public:
         Ship();
         ~Ship();
         char GetShip () const {return itsShip;}
         void SetShip (char ship) {itsShip = ship;}
    
      private:
         char itsShip;
    
    };
    
    Ship::Ship() {}
    
    int main( int argc, char *argv[] )
    {
       Ship* pShip = new Ship[16];
       return 1;
    };
    

    MZ04 schrieb:

    Der Fehler bezieht sich nur auf die Zeile 18. Also wie soll ich die Zeile 18 umschreiben. Der Rest Funktioniert schon so.
    Ich hab auch schon versucht Zeile 18 so zu schreiben:
    Ship* pShip = new Ship[16];
    Doch dann gibt er mir folgenden Fehler aus:
    Ship[int] for Array substrict:
    Mit dieser bezeichnung weiß ich überhaupt nichts anzufangen!
    Also könnt ihr mir Helfen ohne dass ich den gesamten Text verändern muss?

    Du solltest dann aber auch mit

    x = pShip[i]
    

    auf das Objekt zugreifen.

    Nur mal so ne' frage. Warum tippst du erst so viel code und compiliertst dann. Compilier einfach mal zwischendurch, sonst blickst du hinterher nicht mehr durch.



  • Um auf den Text von Ringding zu kommen.
    Ob mit oder ohne EDIT er zeigt mir beide male den gleichen Fehler an.
    no match for '*Ship &'
    Das Gilt für all die Zeilen in denen ich mit

    (*pShip[Poj+(Poi*4)]). ... //... steht für den Zugriff von SetShip / GetShip
    

    arbeite.
    Bei diesen Fehler weiß ich noch nicht, wie ich ihn beheben soll.

    Das Array ohne mit ihm etwas zu machen kann ich auch Kompilieren. Also kann es nicht am Kompiler liegen.
    Was meint ihr eigentlich mit der Zeile

    x = pShip[i];
    

    pShip ist doch schon ein Zeiger der auf das Objekt 'Ship' zeigt.



  • Ich meine damit eine veralgemeinerung:

    Nicht

    x = *pShip[i];
    

    sondern

    x = pShip[i];
    

    halt. Also nimm, zum beispiel:

    pShip[Poj+(Poi*4)].GetShip()
    

    wenn du es so erzeugst, wie ich es oben beschrieben habe.



  • Da hast du aber jetzt einen -> vergessen.



  • Habe ich nicht.

    Nur damit keine Missverständnise aufkommen; das hier compiliert.

    class Ship
    {
      public:
         Ship();
         ~Ship();
    	 char GetShip () const {return itsShip;}
         void SetShip (char ship) {itsShip = ship;}
    
      private:
         char itsShip;
    
    };
    
    Ship::Ship() {}
    
    int main( int argc, char *argv[] )
    {
    	Ship* pShip = new Ship[16];
    
    	int Poj = 1;
    	int Poi = 1;
    
    	char cShip = pShip[Poj+(Poi*4)].GetShip();
    
    	return 1;
    };
    

    Aber nicht mit einem ->



  • Meinst du damit, dass ich für alle Zugriffe ((*pShip[(Poi+(Poj*4))].SetShip)
    erst ein weiteres char Element Deklarieren muss.
    Wenn ja, wie soll ich dann zum schluss darauf zugreifen?
    Denn derjenige, der das benutzt soll entscheiden wo das 'S' ausgegeben werden soll und dass weiß ich noch nicht von vornherrein.
    Alles in einem weiß ich nicht wozu ich eine weitere Variable dazu Deklarieren soll und wie ich darauf zugreifen soll.



  • Nein du musst lediglich das * vor dem pShip weglassen.

    pShip[(Poi+(Poj*4))].SetShip( )
    

Anmelden zum Antworten