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

1

17.07.2007, 12:57

Frage zu Funktionspointern mit abstrakten Klassen

Hi Leute

ich schreibe grade an einem Command system, was auf polymorphie beruht.

Also hab ich eine abstrakte klasse Command:

C-/C++-Quelltext

1
2
3
4
5
6
    class Command
    {
        public:
            virtual ~Command();
            virtual void doCommand() = 0;
    }; 


und davon leite ich dann jedes command ab.
So, jetzt gehts daran die Commands effektiv in laufzeit zu erstellen. und in mein verabeitugnsdeque einzufügen. dafür hab ich mri einen kleinen commandmanager geschrieben, der eine Funktion
createCommand(Name, Parameterdeque) hat. der name ist ein enum und das parameter deque ist dafür da falls ein command weiter parameter benötigt (die ich dann per konstruktor an das Command übergeben würde).

also in der create funktion müsste dann aber ein riesiges switch stehen, mit cases für jedes command. das ist ja nicht grade schön und sicherlich auch nicht performant.
so, jetzt kam mir eine idee.
ich erweiter meine Command klasse um eine create(Parameterdeque) funktion, erstelle mri einen funktionspointer auf die create funktionen aller abgeleiteten klassen und bau mir eine std::map<CommandName, Funktionspointer>

Was haltet ihr davon? geht das überhaupt? ich habe noch nie wirklich mit funktionspointern gearbetiet aber ich habe gehört das dazu dann die create funktion in der Command Klasse static seien müsste?

MfG
Eldarion

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

17.07.2007, 13:01

Re: Frage zu Funktionspointern mit abstrakten Klassen

Zitat von »"Eldarion72"«


Was haltet ihr davon? geht das überhaupt? ich habe noch nie wirklich mit funktionspointern gearbetiet aber ich habe gehört das dazu dann die create funktion in der Command Klasse static seien müsste?


Ja das geht, und nein müssen nicht statisch sein.
@D13_Dreinig

3

17.07.2007, 13:11

aber sonst zegit der pointer der funktion doch immer nur auf eine funktion von einem objekt oder?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

17.07.2007, 13:20

Musst halt ein gültiges Objekt mitliefern.
@D13_Dreinig

5

17.07.2007, 16:18

ok ich glaub ich hab es verstanden. kann man denn auch pointer auf static funktionen machen? meine funktion muss static seien, hab ich grade bemerkt.

edit: ich bin grade auf ein problem gestoßen mit der map, die funktionszeiger haben ja unterschiedliche funktionen zum draufzeigen (also unterschiedliche klassen), wie kann ich denn jetzt eine std::map defenieren? mit der virtuellen create funktion aus Command? oder mit void* ?

edit2: und wie kann ich dann nacher auf den funktionspointer zugreifen?
über

C-/C++-Quelltext

1
return myMap[name](x, y);

ja wohl kaum oder?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

17.07.2007, 16:57

Zitat von »"Eldarion72"«


edit: ich bin grade auf ein problem gestoßen mit der map, die funktionszeiger haben ja unterschiedliche funktionen zum draufzeigen (also unterschiedliche klassen), wie kann ich denn jetzt eine std::map defenieren? mit der virtuellen create funktion aus Command? oder mit void* ?


Was? Mal langsam. Wenn die Funktion statisch ist, spielt die Klasse keine Rolle mehr. Dann läuft das wie mit normalen Funktionszeigern ab. Aber statische Funktionen haben mit virtual überhaupts nichtsmehr am Hut.

Zitat von »"Eldarion72"«


edit2: und wie kann ich dann nacher auf den funktionspointer zugreifen?
über

C-/C++-Quelltext

1
return myMap[name](x, y);

ja wohl kaum oder?


Yo, so in der Art.
@D13_Dreinig

7

17.07.2007, 17:05

so, ok mal langsam.

sry, ich habe erst nicht dran gedacht das meine create funktion am besten statisch seien sollte.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
    class KeyPressed : public Command
    {
        private:
            OIS::KeyEvent e;
            KeyPressed(OIS::KeyEvent&);
        public:
            ~KeyPressed();
            static KeyPressed* create(OIS::KeyEvent&);
            void doCommand();
    };



so, ich will jetzt das meine create Methode mir einen Pointer auf ein neues Objekt von KeyPressed liefert. (ja es musse in neues objekt seien, weil ich fast jedes event mehrmals habne kann).

so, jetzt war meine idee damit ich keien switch anweisung brauche eine std::map zu verwenden, viel schönerer code ;)

also will ich einen funktionszeiger auf create haben um den in die std::map zu packen und von dort aus aufzurufen.
ok, ich werde das jetzt erstmal testen und wenns nicht geht melde ich mich nochmal.

edit: so, ein problem ist jettz beim implementieren noch aufgetreten:

wen ich jetzt meine std::map defeniere schreibe ich ja std::map<name, typvonfunktionspointer>

aber jetzt ist das problem da, der rückgabe typ von meinen create funktionen ist ja nicht immer gleich. dafür könnte man ja noch void* nehmen. aber meine create funktionen können auch unterschiedliche anzahl an parametern haben, was mach ich denn damit?
muss ich dann einen container übergeben der die objekte enthältd damit ich überall dieselbe argumenten liste hab?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

17.07.2007, 21:24

Irgendwie weichst du extremst stark von der ursprünglichen Fragestellung ab... :roll: Wie wärs wenn du mal ganz klar definierst was du willst und dann auch dabei bleibst? Es macht kein Spaß dir zu helfen wenn du ständig andre Ideen hast und das komplette Konzept umkrempeln willst. SO entwickelt man keine Software und genau DESHALB wird vorm Implementieren GEPLANT!
@D13_Dreinig

9

17.07.2007, 21:26

wenn ich für jedes folge problem nen neuen thread aufmachen würde hätte ich jetzt etwa 3-4 threads und iwann würd ich ärger kriegen -.- ich bin es so gewohnt aus anderen foren, sry. dann mach ich halt nen neuen thread auf ...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

17.07.2007, 21:35

Hättest du dir mal Gedanken über dein Problem gemacht würden keine solche Folgeprobleme entstehen... Es macht aber kein Sinn für andere sich was für dich zu überlegen und dann alles umschmeißen zu müssen weil du dir irgendwas anderes ausgedacht hast.

Falls du also keine detailierte Problembeschreibung bringst werde ich für meinen Teil in diesem Thread nichtmehr weiterhelfen.
@D13_Dreinig

Werbeanzeige