Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

11

29.01.2007, 14:48

Im einfachsten Fall heisst das einfach, das du eine public Methode implementierst, welche dann eine private Methode der Klasse aufruft. Oder auch nur eine beliebige andere.

Ein oberflächliches Beispiel

ganz böse, von dem Vektor sollte der "Aussenstehende" nix mitbekommen. Mal abgesehen davon, dass Membervariablen NIEMALS public sein sollten ....

C-/C++-Quelltext

1
InventoryManager.mItemVector[0].addItem(32);

besser (und im Prinzip schon fast akzeptabel), der Nutzer muss dann aber wissen, das das Inventarobjekt die addItem Methode hat. Im Besten Fall sollte es reichen wenn er in der Lage ist den Manager zu bedienen OHNE Kenntnis von der Inventoryklasse zu haben!

C-/C++-Quelltext

1
InventoryManager.getItem(0).addItem(32);

vollständig gewrappt

C-/C++-Quelltext

1
2
3
//Param 1 = Inventory ID

//Param 2 = Item ID

InventoryManager.addItem(0, 32);


Ausserdem solltest du Methoden wie "addInventory" oder dergleichen bereitstellen. Oder soll der Anwender diese Objekte selber konstruieren und dann dem Manager übergeben? Was ist wohl "komfortabler"? (es ist aber nicht falsch diese Möglichkeit bereitzustellen! Einfach die Methode überladen.)

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

12

29.01.2007, 14:52

Abstrakte Klasse implementieren? Heisst im Prinzip nur das du von der abstrakten Klasse erbst. Dann überschreibst du noch Teile die dir nicht zusagen bzw. erweiterst sie um weitere Funktionalität ;)

Um es deutlich zu machen:

C-/C++-Quelltext

1
class StandardInventory : public virtInventory
Mit der Standard Inventoryklasse arbeitest du dann weiter.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

29.01.2007, 14:56

Zitat von »"Das Gurke"«

Abstrakte Klasse implementieren? Heisst im Prinzip nur das du von der abstrakten Klasse erbst. Dann überschreibst du noch Teile die dir nicht zusagen bzw. erweiterst sie um weitere Funktionalität ;)

Um es deutlich zu machen:

C-/C++-Quelltext

1
class StandardInventory : public virtInventory
Mit der Standard Inventoryklasse arbeitest du dann weiter.


Das is so nicht ganz richtig. Eine abstrakte Klasse zeichnet sich vorallem dadurch aus das man von ihr keine Instanz erzeugen kann.
Das Verhalten erreicht man durch rein virtuelle Methoden. Sollte man keine Methode haben die rein virtuell sein kann so nimmt man einfach den Destruktor. Dieser muss ja sowiso virtuell sein.
@D13_Dreinig

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

14

29.01.2007, 14:58

:oops: Stimmt!

Aber auch die "Basisversion" dieser Klasse sollte schon grundlegende Funktionilität bieten, rein virtuell wäre das ja tierisch nervig. Wie nennt man das denn dann? Basisklasse?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

29.01.2007, 15:02

Rein virtuell bedeutet nicht das keine Methodendefinition da sein darf. Es heisst nur das die Funktion überschrieben werden muss.
@D13_Dreinig

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

16

29.01.2007, 15:07

Aber genau dieses Verhalten wäre ja unpraktisch. Ich hab meinen Code grad nicht zur Hand (und auch keinen Compiler o.ä.) aber ich meine, das meine abgeleitete Standardinventarklasse nix als Konstruktor und Destruktor überschrieben hat. Die sind dementsprechend auch virtuell.

Die anderen Funktion (addItem, deleteItem, getItemPos, etc ...) blieben unverändert (und waren auch nicht virtuell). Wie nennt man diese Art der Klassenvorlage denn?

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

17

29.01.2007, 15:08

omg ist das kompliziert :D

also ich werd das jetz einzeln behandeln ^^

hab jetzt nach gründlicher überlegung gemerkt, dass es vielleicht doch nicht so optimal ist aus der verketteten liste ein eigenes objekt zu machen.. allerdings weiß ich jetzt nicht genau wie ich dem inventar jetzt eine verkettete liste übergeben soll.. soll das inventar jetzt solche funktionen besitzen? ... nur mal so nebenbei: an einen inventar manager denke ich jetzt im moment noch nicht.. zur zeit versuche ich nur mal ein einziges inventar-objekt zu erstellen, das objekte beinhalten kann.. damit wäre ich shcon verdammt glücklich! :) ich hab mir das inventar so vorgestellt wie ein beutel in WoW.. also .. das inventar hat zb 8 behälter platz für items.. jeder einzelne platz soll so eine art index-nummer haben.. damit das ganze schön dynamisch bleibt, will ich lieber eine verkettete liste als ein array verwenden..
aber wie gesagt: wie mach ich das jetzt? ^^

soll die klasse inventar die benötigten strukturen und methoden beinhalten um eine verkettete liste zu verwalten?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

$nooc

Alter Hase

  • »$nooc« ist der Autor dieses Themas

Beiträge: 873

Wohnort: Österreich / Kärnten

Beruf: Schüler

  • Private Nachricht senden

18

29.01.2007, 15:09

ich dachte virtuel heißt dass die funktion evtl. überschrieben werden kann, aber nicht unbedingt muss O_o ?

lieg ich da falsch?
Am Anfang der Weisheit steht die eigene Erkenntnis, dass man selbst nichts weiß! - Sokrates

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

19

29.01.2007, 15:13

Nimm std::vector ;) Du übergibst NIEMALS die ganze Liste oder auch nur den Vektor!

Und klar ist diese Liste / Vector / Map ein eigenes Objekt! Aber die INSTANZ der Klasse ist eben eine Membervariable des Inventars ;) Ein Beispiel anhand der "Add Item" Methode.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
standardItem myItem; // Unser Item, welches wir ins Inventar packen möchte, wo das herkommt ist erstmal wurscht

myInventory.addItem(myItem);
// Die Methode

void StandardInventory::addItem(standardItem givenItem)
{
    mItemList.push_back(givenItem); // Einfügen des ITems in die liste, diese IST ein Objekt, aber eben als Membervariable!

    playSound("ItemAdded.ogg");
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

29.01.2007, 15:14

Zitat von »"Das Gurke"«

Aber genau dieses Verhalten wäre ja unpraktisch. Ich hab meinen Code grad nicht zur Hand (und auch keinen Compiler o.ä.) aber ich meine, das meine abgeleitete Standardinventarklasse nix als Konstruktor und Destruktor überschrieben hat. Die sind dementsprechend auch virtuell.

Die anderen Funktion (addItem, deleteItem, getItemPos, etc ...) blieben unverändert (und waren auch nicht virtuell). Wie nennt man diese Art der Klassenvorlage denn?


Nennt man einfach nur Basisklasse bzw die abgeleitete Klasse ist eine Generalisierung von der Basisklasse.

Zitat von »"$nooc"«


ich dachte virtuel heißt dass die funktion evtl. überschrieben werden kann, aber nicht unbedingt muss O_o ?

lieg ich da falsch?


Das bedeutet virtual auch. Nur wenn eine Methode rein virtuell ist muss sie zwingend überschrieben werden.
@D13_Dreinig

Werbeanzeige