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

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

1

29.06.2006, 20:44

void* + virtual = Mist?

Hi,

Ich habe ein interessantes Problem:

C-/C++-Quelltext

1
2
3
4
this->CreateNewClient(adresse, tempsocket); //virtuelle und überladen Funktion -> die korrekte Funktion wieder geladen!

void* pointer = this;
Server* s = static_cast<Server*>(pointer); //Zeiger pointer und s sind an und für sich identisch

s->CreateNewClient(adresse, tempsocket); // nur die nicht überladenene Funktion wird aufgerufen

Warum ich das brauche? Tja Multithreading :). Ich habe es auch mit einem Zeiger auf einen Zeiger versucht sowie mit einer Struktur, die den Zeiger enthält. Hat jemand eine gute Idee, wie ich verhindere, dass der Zeiger seine überladenen Methoden verliert?
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

2

29.06.2006, 20:50

Hmn sieht mir sehr gefährlich aus was Du da machst um genau zu sein. Ich hätte ggf. noch ne Lösung, bräuchte aber dafür paar weitere Infos, wofür Du das brauchst, wie der Aufbau ist usw.

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

3

29.06.2006, 21:19

So...dann will ich euch mal mit ein paar Zeilen quälen :D

C-/C++-Quelltext

1
2
3
4
5
6
7
class Netzwerk  
{
    [...]
    unsigned int (WINAPI *Funktion)(void*); 
    void empfangstarten(void);
                [...]   
};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
void Netzwerk::empfangstarten(void)
{
    if(Funktion)
    {
    #ifdef _WIN32
    unsigned threadID;
    ThreadId = (HANDLE) _beginthreadex( NULL, 0, Funktion, this, 0, &threadID );
    #else
    void* (*tempfunc)(void*) = (void*(*)(void*))Funktion;
    pthread_create(&thread1, 0, tempfunc, this);
    #endif
    }
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Server : public Netzwerk
{                              
    static unsigned int WINAPI empfangen(void*); // Diese Funktion wird als Thread gestartet

public:
    [...]
    virtual Clients* CreateNewClient(sockaddr_in& sock, int &socket); //Die zu überladen Methode

                [...]
};


C-/C++-Quelltext

1
2
3
4
5
6
7
8
class MyServer : public Server
{    
public:               
    DatenVerbindung* Verbindung;

    MyServer(DatenVerbindung* v) : Verbindung(v)                { this->Server::Server("Firegalaxy-Server", MAXPLAYER, GSOCKET); }
    Clients* CreateNewClient(sockaddr_in& sock, int &socket)    { return new MyClients(sock, socket, this); } //Die überladene Methode, die eigentlich aufgerufen werden sollte

};
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

4

29.06.2006, 21:22

C-/C++-Quelltext

1
2
3
4
5
6
7
8
class Server : public Netzwerk 
{                                
    static unsigned int WINAPI empfangen(void*); // Diese Funktion wird als Thread gestartet 

public: 
    [...] 
    virtual Clients* CreateNewClient(sockaddr_in& sock, int &socket) = 0; //Die zu überladen Methode 

                [...] 
};
:roll:

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

5

29.06.2006, 21:29

Scherzkeks^^. Das habe ich natürlich auch schon versucht. Das Ergebnis ist das selbe :)

P.S: Der Fehler der kommt ist R6025
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

6

29.06.2006, 21:35

Ist nur eine Vorahnung: Mach das virtual bei server mal weg.

Ansonsten muß ich mal was vorbereiten...

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

7

29.06.2006, 21:39

Zum Testen der Sache reicht schon dieser Test-Ausschnitt:

C-/C++-Quelltext

1
2
3
4
this->CreateNewClient(adresse, tempsocket); //virtuelle und überladen Funktion -> die korrekte Funktion wieder geladen! 

void* pointer = this; 
Server* s = static_cast<Server*>(pointer); //Zeiger pointer und s sind an und für sich identisch 

s->CreateNewClient(adresse, tempsocket); // nur die nicht überladenene Funktion wird aufgerufen

Dazu muss die Methode CreateNewClient einmal überladen sein. Warum sollte ich das Virtual weg machen? Ohne virtual geht es natürlich nicht :)
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Anonymous

unregistriert

8

29.06.2006, 21:42

Wenn Freundin neben einem Sitzt, ist es schwer zu denken ^^

Ich guck morgen nochmal.

Nox

Supermoderator

  • »Nox« ist der Autor dieses Themas

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

9

30.06.2006, 00:05

Also Kinder, macht niemals sowas:

C-/C++-Quelltext

1
MyServer(DatenVerbindung* v) : Verbindung(v)                { this->Server::Server("Firegalaxy-Server", MAXPLAYER, GSOCKET); } 
:lol:
Das hat mich jetzt einen kompletten Tag gekostet. Dass der aufgerufene Konstruktur natürlich die __vfptr überschreibt, tztztz :evil:
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

ext

Treue Seele

  • Private Nachricht senden

10

30.06.2006, 02:20

Steht doch in jedem Anfängerbuch, dass der Konstruktor der Basisklasse in der Initialisierungsliste aufgerufen werden muss.

Werbeanzeige