Avatar billede thomas_nj Nybegynder
13. marts 2005 - 20:21 Der er 11 kommentarer og
1 løsning

Pæn måde at arbejde med koordinater

Hej eksperter

  Jeg vil gerne lige have et råd vedrørende et program hvori jeg skal bruge koordinater (arbejder i 2d så kun x og y).
  Programmet skal kunne gøre følgende ting med koordinaterne:
  * Se om de er ens
  * Flytter dem en tak i hver af aksernes retninger.

  Selv har jeg overvejet at lave et koordinat som en klasse og derefter lade en udenforstående funktion stå for sammenligningerne. Overvejer lidt at overloade ==.

  Nu står jeg bare tilbage med problemet om hvordan jeg griber problemet med at flytte dem et punkt. Altså enten lægge 1 eller -1 til enten y eller x-værdien. Min bedste ide er at lave funktioner der hedder xplus, xminus osv i klassen.

  Findes der ikke en smartere metode til at gribe dette an på?
Avatar billede arne_v Ekspert
13. marts 2005 - 20:50 #1
Jeg ville jo nok lave en move metode med to argumenter: difx og dify
Avatar billede bertelbrander Novice
13. marts 2005 - 20:58 #2
#include <iostream>

class PointClass
{
public:
  PointClass(int aX, int aY) : X(aX), Y(aY)
  {}
  bool operator == (const PointClass &rhs)
  {
      return X == rhs.X && Y == rhs.Y;
  }
  bool operator != (const PointClass &rhs)
  {
      return !(operator == (rhs));
  }
  class CoorClass
  {
  public:
      CoorClass(int aC) : C(aC)
      {
      }
      CoorClass & operator ++()
      {
        C++;
        return *this;
      }
      CoorClass & operator --()
      {
        C--;
        return *this;
      }
      bool operator == (const CoorClass &rhs)
      {
        return C == rhs.C;
      }
      int C;
  };
  CoorClass X;
  CoorClass Y;
};



int main()
{
  PointClass P1(10, 10), P2(10, 11), P3(10, 10);
  if(P1 == P3)
      std::cout << "P1 and P3 is at same spot" << std::endl;
  if(P1 != P2)
      std::cout << "P1 and P2 is not at same spot" << std::endl;
  --P2.Y;
  if(P1 == P2)
      std::cout << "P1 and P2 is at same spot" << std::endl;

}
Avatar billede thomas_nj Nybegynder
13. marts 2005 - 21:06 #3
bertelbrander >> Mange tak for eksemplet, må indrømme jeg ikke helt har tænkt i den retning. Har bare lige et spørgsmål.
  Bruger man ofte det at have en klasse inden i en anden?
Avatar billede thomas_nj Nybegynder
13. marts 2005 - 21:08 #4
mener deffinere den inden i en anden, lød lidt forkert
Avatar billede bertelbrander Novice
13. marts 2005 - 21:45 #5
Ofte og ofte...

Hvis en class kun skal bruges af en anden class er det en god idé at gøre det.
Det er ikke noget jeg bruger ofte, men det forekommer.
Avatar billede thomas_nj Nybegynder
13. marts 2005 - 22:09 #6
ok
  arne_v >> gider du ikke svare?
  bertelbrander >< Mangfe tak for eksemplet, det bliver en stor hjælp
Avatar billede arne_v Ekspert
13. marts 2005 - 22:26 #7
jeg kan vist ikke fortjene point her ...
Avatar billede thomas_nj Nybegynder
14. marts 2005 - 09:55 #8
Du har da taget dig tid til at læse mit spørgsmål og komme med en kommentar. Men vil da ikke tvinge dig til at tage imod point :)
Avatar billede thomas_nj Nybegynder
14. marts 2005 - 16:03 #9
Tænkte lige på, hvis jeg ændrer koden til følgende:

#include <iostream>

class PointClass
{
public:
  PointClass(int aX, int aY) : X(aX), Y(aY)
  {}
  bool operator == (const PointClass &rhs)
  {
    return X == rhs.X && Y == rhs.Y;
  }
  bool operator != (const PointClass &rhs)
  {
    return !(operator == (rhs));
  }

  int X;
  int Y;
}



int main()
{
  PointClass P1(10, 10), P2(10, 11), P3(10, 10);
  if(P1 == P3)
    std::cout << "P1 and P3 is at same spot" << std::endl;
  if(P1 != P2)
    std::cout << "P1 and P2 is not at same spot" << std::endl;
  --P2.Y;
  if(P1 == P2)
    std::cout << "P1 and P2 is at same spot" << std::endl;
}

  SÅ virker det stadig. Hvad er fordelen ved CoorClass så?
Avatar billede arne_v Ekspert
14. marts 2005 - 16:39 #10
encapsulation
Avatar billede bertelbrander Novice
14. marts 2005 - 19:35 #11
I dette simple eksempel er der ikke den store fordel ved at bruge CoorClass frem for en almindelig int, men,

Hvis PointClass bruges til at repræsentere en mand i et shoot-em-up spil, kunne man bruge ++ og -- operatoren i CoorClass til at flytte manden på skærmen.
Avatar billede thomas_nj Nybegynder
19. marts 2005 - 11:57 #12
Igen mange tak for jeres svar. Jeg har fået det til at virke efter planen så det kunne ikke være meget bedre
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis