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

idontknow

unregistriert

1

24.01.2010, 01:12

Virtuelle Methode soll orginal automatisch aufrufen!

Moin!

Ich schreibe gerade einen Manager für Resourcen. Eine Resource Klasse definiert einige Grund funktionen, darunter 2 virtuele Methoden LoadFromFile undeine unrelevante andere :).
LoadFromFile erwartet als Parameter den FileName und speichert diesen in einer Membervariable ab.

Wenn ich jetzt von der Klasse Resource ableite und die LoadFromFile Methode implementiere, hätte ich es gerne, dass automatisch in dieser Methode am Anfang Resource::LoadFromFile(FileName) aufgerufen wird un wollte fragen ob das möglich ist.

Bevor sich jetzt jemand fragt warum das nötig ist die kurze Auflößung: Der Manager speichert von jeder Resource nur eine Uint ID. Die eindeutige identifiezierung läuft dabei über den FileName, sprich man kann aus einer Date nur EINE Resource "erstellen". Dazu ist es eben erforderlich den FileName zu speichern, was aber dann in jeder abgeleiteten Klasse gemacht werden müsste.

mfg

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

2

24.01.2010, 01:21

da brauchsu keine virtuelle methode. du kannst ja die methode der basisklasse verwenden um den string der auch zur basisklasse gehören sollte zu speichern.
oder willst du für jede resource eine statische klasse(singleton) implementieren?
ich glaub du willst die vererbung falsch einsetzen.
schreib lieber eine singleton klasse die alle resourcen verwaltet und greif über diese auf die resourcen zu.
die resourcen unterscheiden sich doch nur in ein paar werten.(größe, name, id) oder benötigt jedes/r bild/sound eine andere implementierung und andere datenelemente?

achja. du kannst die virtuellen methoden der basisklasse aus der überschriebenen methode in der abgeleiteten klasse aufrufen.

Quellcode

1
2
3
4
// in der abgeleiteten klasse
void abgeleitet::funktion() {
basisklasse::funktion();
}

mehr brauchsu nicht^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

24.01.2010, 01:22

Das geht so leider nicht.

Was du aber machen könntest ist das ganze andersrum anzugehen.
Gib Resource eine nicht virtuelle Methode LoadFromFile(FileName) die das Zeug mit dem Manager abwickelt und eine rein virtuelle protected Methode Load() die von der abgeleiteten Resource implementiert und von der echten LoadFromFile() aufgerufen wird:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Resource
{
protected:
  virtual Load(const char* filename) = 0;

public:

  void LoadFromFile(const char* filename)
  {
    // here be dragons


    Load(filename);

  }

};

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

24.01.2010, 01:27

hab ich was falsch verstanden?

@dot: wann würde das sinn machen?^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

idontknow

unregistriert

5

24.01.2010, 01:31

Jein.

Also erstmal basiert die ganze Idee auf nem Manager :P. Und Resourcen unterscheiden sich nicht nur in größe, name und id, sondern auch in ihrem Type (Sound, Grafik,...).

Und so wie du es gesagt hast, hätte es bedeutet, dass ich in jeder abgeleiteten klasse, die "SetzeFileName" Methode am Anfang aufrufen hätte müssen, es ging aber genau darum das zu vermeiden, sodass es automatisch gemacht wird :P.^^

Trotzdem danke, dot hats erkannt :). Hab ihn aber auch im IRC zugemüllt damit xD

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

24.01.2010, 12:14

*confused*
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

7

24.01.2010, 13:53

Zitat von »"NachoMan"«

hab ich was falsch verstanden?

@dot: wann würde das sinn machen?^^

Das, was dot da zeigt nennt sich das NVI (non virtual interface) - Idiom.

Das ist dazu da, um auch im Falle von virtueller Vererbung Herr über die Lage zu sein. Wenn du eine virtuelle Funktion hast, die jede abgeleitete Klasse die Funktion so implementieren kann, wie er will, dann verlierst du als programmierer der Basisklasse die Macht darüber zu entscheiden, was überhaupt gemacht werden darf (z.B preconditions checken, ein lock setzen usw.) und so etwas sollte bei guter Kapselung nie der Fall sein. Es ist eigentlich sehr mit öffentlichen Datenmembern einer Klasse zu vergleichen.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

8

24.01.2010, 14:03

aha danke für die erklärung vllt werd ichs irgentwann verstehen.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

24.01.2010, 14:10

Zitat von »"NachoMan"«

aha danke für die erklärung vllt werd ichs irgentwann verstehen.

Das Prinzip ist ganz einfach. Stellt dir mal das hier vor:

C-/C++-Quelltext

1
2
3
4
5
class Resource
{
public:
  virtual Load(const char* filename) = 0;
};

Und du willst natürlich checken, ob filename überhaupt ein gültiges Handle ist. (also nicht 0 ist). Was kann man in dem Falle tun, um das sicher zu stellen? Nichts anderes, als mit einem Kommentar die Leute dazu anzuhalten das zu machen. Garantie gibt es keine. Wenn wir aber das NVI Idiom benutzen fällt uns das sehr leicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Resource
{
protected:
  virtual Load(const char* filename) = 0;

public:

  void LoadFromFile(const char* filename)
  {
    if ( filename )
       Load(filename);
    else
    {
       /* Fehlerbehandlung */
     }
  }
};

Man lässt also die abgeleiteten Klassen lediglich das machen, was sie auch machen sollen und um den Rest kümmerst du dich selbst und kannst dementsprechend auch eine Garantierte Schnittstelle anbieten.

Bei dem Beispiel mag das nicht sehr sinnvoll erscheinen, aber ich denke du weisst in etwa, auf was es hinausläuft. Bei z.B Multithreading Anwendungen kann sich so die Funktion um Sachen, wie Locking kümmern und dann muss das nicht jede abgeleitete Klasse selbst machen. Man kann natürlich dann auch Ergebnise der aufgeruferenen Funktion testen und ggf. entsprechend handeln.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

10

24.01.2010, 14:14

ahhh super danke. vllt lag es am beispiel^^
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Werbeanzeige