Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » interaktion zwischen klassen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
31.10.2004, 13:33 Uhr
Lensflare



Hallo.

ich lerne gerade c++, dh was es mit den klassen und so auf sich hat.
Ich hab im folgenden code zwei klassen erstellt, "Punkt" und "Kreuz":


C++:
class Punkt
{
public:
  int GetX();
  int GetY();
  void SetX(int setX);
  void SetY(int setY);
  
private:
  int itsX;
  int itsY;
};

class Kreuz
{
public:
  Punkt GetLocation();
  Punkt GetSize();
  void SetLocation(Punkt setLocation);
  void SetSize(Punkt setSize);
  
  int GetColor();
  void SetColor(int r, int g, int b);
  
  void DrawIn(BITMAP *setTarget);
  
private:
  Punkt itsLocation;
  Punkt itsSize;
  int itsColor;
};

int Punkt::GetX()
{
  return itsX;
}

int Punkt::GetY()
{
  return itsY;
}

void Punkt::SetX(int setX)
{
  itsX = setX;
}

void Punkt::SetY(int setY)
{
  itsY = setY;
}

Punkt Kreuz::GetLocation()
{
  return itsLocation;
}

Punkt Kreuz::GetSize()
{
  return itsSize;
}

void Kreuz::SetLocation(Punkt setLocation)
{
  itsLocation = setLocation;
}

void Kreuz::SetSize(Punkt setSize)
{
  itsSize = setSize;
}

int Kreuz::GetColor()
{
  return itsColor;
}

void Kreuz::SetColor(int r, int g, int b)
{
  itsColor = makecol(r,g,b);
}

void Kreuz::DrawIn(BITMAP *setTarget)
{
  line(setTarget, itsLocation.GetX()-itsSize.GetX()/2, itsLocation.GetY(), itsLocation.

GetX()+itsSize.GetX()/2, itsLocation.GetY(), itsColor);
  line(setTarget, itsLocation.GetX(), itsLocation.GetY()-itsSize.GetY()/2, itsLocation.

GetX(), itsLocation.GetY()+itsSize.GetY()/2, itsColor);
}




Wie man sieht, benutzt "Kreuz" die "Punkt"-Objekte, um aus ihnen ein Kreuz zu basteln (das

dann ein Mauszeiger werden soll)

Im nächsten code(fragment) habe ich zwei objekte von der klasse "Punkt" erstellt (also zwei

punkte), und übergebe diese an das "Kreuz"-Objekt über die Methode SetLocation()


C++:
  Punkt MausZeigerPosition;
  Punkt MausZeigerGroesse;
  MausZeigerGroesse.SetX(20);
  MausZeigerGroesse.SetY(20);

  Kreuz Mauszeiger;
  Mauszeiger.SetSize(MausZeigerGroesse);


  while(1)
  {
    MausZeigerPosition.SetX(mouse_x);
    MausZeigerPosition.SetY(mouse_y);
    Mauszeiger.SetLocation(MausZeigerPosition);
    Mauszeiger.SetColor(255,128,0);
    Mauszeiger.DrawIn(doubleBuffer);
  }



Und nun die Frage:
Es muss doch sicherlich irgendwie möglich sein, die Position (Location) des mauszeigers

anzugeben, OHNE dafür einen Punkt zu erstellen.
Die position wird doch sowieso in form eines punktobjekts in dem Mauszeigerobjekt selbst

gespeichert.

Um es verständlicher zu machen:
Wenn ich die X und Y Koordinaten des mauszeigers haben will, schreibe ich

C++:
Mauszeiger.GetLocation().GetX();
Mauszeiger.GetLocation().GetY();


und das selbe brauche ich für das setzen der koordinaten... nur wie schreibe ich das?
Nochmal: Ich will es vermeiden, für jedes kreuzobjekt zwei punkte anlegen zu müssen.

Achja... ich könnte natürlich "itsLocation" auf public setzen, aber ich hab gelesen, dass

man das nie tun sollte und immer über Methoden darauf zugreifen sollte.

Danke schonmal für die Vorschläge
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
31.10.2004, 14:04 Uhr
typecast
aka loddab
(Operator)


Erstell doch einfach eine weitere Methode mit der du die Punkte setzen tust:


C++:
void Kreuz::setPos(int x, int y) {
  isLocation.SetX(x);
  isLocation.SetY(y);
}


--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
31.10.2004, 14:20 Uhr
Lensflare



Ich hab mir schon gedacht das sowas in der art kommt...

also wenn ich so ne methode schreiben würde, dann hätte ich zwei draus gemacht, eine für x-wert und andere für y-wert. Weil ich sonst ein problem hätte, wenn ich zB NUR den x-wert verändern wollte und den y-wert so lassen wollte wie er war.

aber so eine art von methode zu schreiben wäre denk ich nicht sinnvoll aus folgendem grund:

angenommen ich habe ne klasse, die mit "Punkt"-Objekten arbeitet (so wie "Kreuz").
Nur ist diese Klasse viel komplexer und hat so um die 100 verschiedene "Punkt"-Objekte.
Dann müsste ich also um die koordinaten eines jeden punktes zu setzen genau 200 methoden schreiben. Und im 3d-koordinatensystem wären es 300.

Da ich aber in der Klasse "Punkt" schon ne methode "SetX() und SetY()" habe, könnte ich doch irgendwie davon gebrauch machen. Ich meine genau dafür sind doch diese Klassen da (bzw. Objektorientiertes Programmieren).

Also wie gesagt:

C++:
Mauszeiger.GetLocation().GetX();
Mauszeiger.GetLocation().GetY();


sowas lässt sich machen, ohne dass ich eine weitere methode der "Kreuz"-Klasse brauche.
Ich bediene mich einer Methode aus der "Punkt"-Klasse
Aber wie ist es mit dem setzen der werte?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 31.10.2004 um 14:24 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
31.10.2004, 14:55 Uhr
typecast
aka loddab
(Operator)



Zitat:

also wenn ich so ne methode schreiben würde, dann hätte ich zwei draus gemacht, eine für x-wert und andere für y-wert. Weil ich sonst ein problem hätte, wenn ich zB NUR den x-wert verändern wollte und den y-wert so lassen wollte wie er war.



Ja, ich auch, aber ich war zu faul um das auszuschreiben


Die einzelnen Punkte wuerdest du dann ja in einem Array oder Vektor speichern. Deswegen kannst du der setPos Funktion einen Index mitgeben, das dann den Punkt identifiziert.


C++:
void Kreuz(int welcherPunkt, int x, int y) {
   isLocation[welcherPunkt].setX(x);
   isLocation[welcherPunkt].setY(y);
}



Du wuerdest natuerlich nur einmal jeden Punkt einzeln setzen. Wenn du die Struktur des Mauszeigers schon hast, dann brauchst du nur noch einen Punkt neu setzen. Du kannst dann ja die Differenz zwischen der alten und der neuen Position des Punktes bestimmen, und alle anderen Punkte um diesen Wert verschieben (also nochmal eine Methode die das macht).
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
31.10.2004, 15:08 Uhr
Lensflare



hmmm gute idee...

jedoch scheint sie eher wie eine notlösung :o)
könnte ja sein, dass ich nicht mehr weiss, was genau der punkt nummer 79 macht. Und da wären aussagekräftige punktnamen (bzw. methodennamen) besser als ein index. Hab ich nicht recht?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
31.10.2004, 15:40 Uhr
(un)wissender
Niveauwart


Ich habe, ehrlich gesagt, nicht verstanden was du willst.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
31.10.2004, 16:00 Uhr
typecast
aka loddab
(Operator)


@(un)wissender:

Macht nichts, ich glaub ich habs verstanden

@Lensflare:

Nein hast du nicht. Es kann dir egal sein, was der Punkt 79 macht (solange er sich nicht unabhaengig von den anderen bewegt). Wenn du jedem Punkt einen eigenen Methodennamen geben wuerdest, dann kannst du die Klasse die fuer 5 Punkte ausgelegt hast nicht fuer 10 Punkte verwenden.
Du muesstest eine neue Klasse dafuer schreiben. Und das ist ja wirklich nicht Sinn und Zweck der Uebung.
--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
31.10.2004, 16:21 Uhr
Lensflare



@typecast:
Hmmm, wenn ich ein eine klasse hätte, die aus punkten ein ganzes haus in 3d zusammenstellt und das wären denk ich ein haufen punkte. Und ich würde einige punkte die zB ein fenster bilden ändern wollen, dann wären doch punktenamen sinnvoll.

Das Fenster wird aber mit dem haus bewegt und ist deshalb nicht unabhängig.

Oder wäre es besser, Klassen wie "Fenster" "Tür" usw. zu erstellen und aus ihnen die Klasse "Haus" aufzubauen?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
31.10.2004, 17:19 Uhr
(un)wissender
Niveauwart


Nun weiß ich, was du meinst.
Solche Koordinaten werden meisten statisch festgelegt und in Dateien abgespeichert.
Zur Laufzeit werden sie geladen und dann u. U. umgerechnet.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
31.10.2004, 18:47 Uhr
Lensflare




Zitat von (un)wissender:

Solche Koordinaten werden meisten statisch festgelegt und in Dateien abgespeichert.
Zur Laufzeit werden sie geladen und dann u. U. umgerechnet.


hmmm??? statisch festgelegt? zur laufzeit geladen? Ich versteh nur bahnhof.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 31.10.2004 um 18:48 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: