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

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

1

31.08.2009, 18:08

Memberpointer zu void* casten

Hi

Wenn ich einen memberpointer zu einem void* casten will,
sagt mir der compiler das das nicht geht...
Aber wiso sollte das nicht gehen ? ist doch auch nur ein Zeiger
der irgendwo hinzeigt ( und das ebenfalls mit 4 Byte )...

2

31.08.2009, 18:10

Hi,

dann zeig doch mal nen bisschen Code, also die Fehlerstelle und den Compilerfehler.

Zero

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

31.08.2009, 18:26

Kommt auf den cast drauf an. ;)
reinterpret_cast sollte funktionieren.

Die Frage ist eher, für was du das machst. Nur mal so in den Raum gestellt. Du kannst eine Memberfunktion nicht gleich übergeben, wie eine freie Funktion. (ala Rückruffunktion und co.)

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

4

31.08.2009, 18:40

Zitat von »"drakon"«

Du kannst eine Memberfunktion nicht gleich übergeben, wie eine freie Funktion. (ala Rückruffunktion und co.)


Ach wenn doch alles einfach wäre :)

Ne nur kleiner Scherz... reinterpret_cast geht nämlich auch nicht !

Hier nen bisl Quellcode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>

using namespace std;


class test
{
public:
    void Hallo()    { cout << "Hallo"; }
};

typedef void (test::*func)();


void call(void* p)
{
    test d;
    func f = (func)p;

    (d.*f)();
}

int main()
{   
    
    call(reinterpret_cast<void*>(&test::Hallo));

    cin.get();

    return 0;
}


Fehler:

Quellcode

1
2
3
4
e:\c++\workspace\test\test\main2.cpp(21) : error C2440: 'type cast' : cannot convert from 'void *' to 'func'
        There is no context in which this conversion is possible
e:\c++\workspace\test\test\main2.cpp(31) : error C2440: 'reinterpret_cast' : cannot convert from 'void (__thiscall test::* )(void)' to 'void *'
        There is no context in which this conversion is possible


Ich weiß natürlich dass man die nicht genz so einfach vergleichen kann...
die Pointergröße ist ja auch nicht festgeschrieben....

Naja wenn das nich geht muss ich wohl was serialisierungs-mäßiges Proggen.... :)

5

31.08.2009, 18:50

Nein, woher soll der Compiler über diesen Funktionsaufruf wissen, zu welchem Objekt die Methode gehört?
Es wird implizit und versteckt ein Zeiger auf das Objekt übergeben, auf das sich dann alle Memberzugriffe beziehen. Was du da machst kann also höchstens mit static Funktionen gehen.
Lieber dumm fragen, als dumm bleiben!

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

6

31.08.2009, 19:01

Bei dem Memberpointer sollte es sich ja nur um eine Offsetaddresse handeln...
durch das casten nach "func" ist die Klasse wieder bekannt...
durch den aufruf über den operator ".*" werden instanze und memberpointer
wieder vereint... also eigentlich müsste es gehen...

statische funktionen sind ja keine wirklichen memberfunktionen (jedenfalls was den speicher anbelangt)...
für membermethoden brauch man dir klasse ja auch nicht wissen...

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

7

31.08.2009, 19:11

C-/C++-Quelltext

1
2
3
4
5
union
{
    void *ptr;
    memptr mem;
};
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

8

31.08.2009, 19:13

Die Funktionen gibt es doch pro Klasse einmal und nicht pro Objekt. Nur über den Pointer kann man also raus finden, welche Klasse es ist, aber nciht welches Objekt. Und diese Information fehlt eben.
Lieber dumm fragen, als dumm bleiben!

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

9

31.08.2009, 19:18

Warum machst du es nicht einfach so?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void call(func p)
{
    test d;
    func f =  p;

    (d.*f)();
}

int main()
{   
   
    call(&test::Hallo);

    cin.get();

    return 0;
}


Das ganze ist doch wunderbar ohne das gecaste.. Es können ja sowieso nur Funktionen von test übergeben werden, ansonsten macht es ja keinen Sinn..

@Jonathan_Klein
Er hat da ja ein Objekt. Wo ist das Problem?

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

10

31.08.2009, 19:24

Hehe drakon.. schön wärs :) aber wie man an den spartanischen namen wie "test", "Hallo" etc vtl hätte sehen können ;)
handelt es sich hierbei nur um ein testprogramm (ein modellversuch sozusagen ;))

Tja und ich werde wohl dann mal noch ne template-klasse schreiben,
die das dann alles managed...

@Gotbread
Das ist auch meine jetztige lösung... das problem ist dabei nur, dass ich nicht weiß
wie sicher das ganze ist...

Werbeanzeige