PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : protected/private und public members einer class (c++)


DerTod2k
2003-01-02, 21:02:01
joa .. also ich hab mal ne frage bez. c++ und klassen.
angenommen ich mach jetzt beispielsweise n spiel .. und hab da ne spielfigur oder ähnliches, die einen laser oder so auf nen gegner abfeuert. der laser wird durch den spieler erstellt und erledigt den rest (in festgelegte richtung wegfliegen etc.) selber. nun trifft er auf nen gegner und muss beim spielfigur-objekt nen punkt für den treffer gutschreiben. die punkte sind aber eigentlich protected/private, da sie von anderen stellen aus nicht beschrieben werden sollen.

was ist da am geschicktesten?
- die punkte als public deklarieren
- den laser als friend-class definieren
- für alle anderen klassen ein interface benutzen, von dem die spielfigur abgeleitet ist (naja lieber doch net :D)
- was anderes ?

??
tjo .. sagt mal was ihr da machen würdet.

Nagilum
2003-01-02, 21:12:40
Ich würd im Gegner-Object eine Public-Methode DoDamage() einbauen, die den Wert der privaten Variable ändert.

Beim direkten Zugriff auf die Variable müsste ja dann auch der Laser überprüfen, ob z.B. die Lebenspunkte auf Null gesunken sind.

"Friend" ginge natürlich auch, aber designtechnisch sind sie unschön, und der Laser ist ja sicher nicht die einzige Klasse die Schaden auslösen kann?

DerTod2k
2003-01-02, 21:16:42
hmm .. stimmt schon ..
Was aber nix dran ändert, dass man den Wert der Variablen überall beliebig ändern kann und sie somit eigentlich auch gleich public machen könnte. Wo wäre sonst noch der Unterschied, außer das man sie dann noch lesen könnte?

Nagilum
2003-01-02, 21:27:41
Der Unterschied ist, wie gesagt, dass das Gegnerobjekt informiert wird, wenn es Schaden genommen hat.

Wo würde man sonst eine Überprüfung vornehmen, ob der Gegner durch den Schaden stirbt? Das müsste ja dann der Laser machen, oder man müsste sowas Krankes proggen:

gegner->m_iLifePoints--;
gegner->CheckYourself();

Mit DoDamage() säh das so aus:

void CGegner :: DoDamage( INT iDamage )
{
this->m_iLifePoints -= iDamage;
if ( this->m_iLifePoints <= 0)
this->GotoSensemann();
}


Was stört dich denn daran, dass auch andere Objekte DoDamage() aufrufen können? Wenns wirklich so nervt dann kannste ja folgendes machen:

- DoDamage() als private Methode einbauen und den Laser als Friend setzen

- Du machst ne Interface-Klasse für alle Objekte die beim Gegner Schaden verursachen können und lässt den Laser davon erben (wohl sehr abgefahren für so eine kleine Sache)


Aber direkter Zugriff auf Variablen eines Objekts ist immer böse. :D

Vedek Bareil
2003-01-03, 01:16:15
Originally posted by DerTod2k
hmm .. stimmt schon ..
Was aber nix dran ändert, dass man den Wert der Variablen überall beliebig ändern kann und sie somit eigentlich auch gleich public machen könnte. Wo wäre sonst noch der Unterschied, außer das man sie dann noch lesen könnte? der Unterschied liegt in der Philosophie: ein objektorientiert programmierter Laser tötet keinen Gegner, sondern sendet eine Nachricht an den Gegner, daß der sich selbst töten soll :D

Sorry, diesen Spruch mußte ich einfach mal bringen ;)

Nagilum
2003-01-03, 02:05:46
*ROTFL* :D

OO-Programmier lassen halt schaffen. :D

Demirug
2003-01-03, 02:27:08
Originally posted by Vedek Bareil
der Unterschied liegt in der Philosophie: ein objektorientiert programmierter Laser tötet keinen Gegner, sondern sendet eine Nachricht an den Gegner, daß der sich selbst töten soll :D

Sorry, diesen Spruch mußte ich einfach mal bringen ;)

Das ist aber nicht ganz richtig.

ein objektorientiert programmierter Laser erzeugt ein Objekt der Klasse Laserstrahl.

Ein Übergeordnetes Physik Object erkennt dann die Kollision mit einem Playerobjekt.

Darauf wird dem Playerobject eine Kollision mit dem Layerstrahlobject gemeldet.

Das Playerobject kann nun entscheiden was es mit dem Layerstrahl macht (aufnehmen, zurückwerfen, oder sonst irgendwas).

Erkennt das Playerobject einen Schaden an wird dieser von der internen Lebensenergie abgezogen.

Erreicht die Lebensenergie 0 entsorgt sich das Playerobject selbst.

:D

liquid
2003-01-03, 02:38:48
Wie war das noch mit den ganzen Programmiersprachen und der Jagd nach Elefanten?
C++ Programmierer argumentieren damit, dass der Elefant ein Objekt sei und deshalb seine Fang-Methode selbst mitzubringen habe.

Ich grab mal in nächster Zeit den Link aus, dann haben alle was zu lachen! :D

cya
liquid

MeLLe
2003-01-03, 10:50:21
Originally posted by Vedek Bareil
der Unterschied liegt in der Philosophie: ein objektorientiert programmierter Laser tötet keinen Gegner, sondern sendet eine Nachricht an den Gegner, daß der sich selbst töten soll :D

Sorry, diesen Spruch mußte ich einfach mal bringen ;)
Danke. Das hilft mir beim Munterwerden ;) :D ;D

liquid
2003-01-03, 16:26:41
Gefunden!!

Drück mich!! (http://www.unifix.de/elefantenjagd/index.shtml)

cya
liquid