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

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

24.02.2009, 21:19

[Erledigt] Methodenzeiger

Wäre mir neu, dass man Memberfunktionen adressieren kann O_o
<< an dieser Stelle ist eine Signatur verstorben >>

2

24.02.2009, 21:20

stimmt, ist irgendwie logisch es gibt ja noch überhaupt keine instanz ^^
dann müsste ich eine externe Funktion nehmen, die ich in der Klasse als friend deklariere.

schade, geht ja auch nicht weil es immernoch keine instanz gibt ;(

3

24.02.2009, 23:56

the[V]oid? Was meinst du genau mit Adressieren? Du kannst ohne weiteres einen Memberfunktionszeiger anlegen, brauchst aber immer ein gültiges Objekt um diesen zu nutzen!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

4

25.02.2009, 01:11

Meine mich zu erinnern, vor langer Zeit mal gelesen zu haben, Memberfunktionen könnten nicht über Funktionspointer angesprochen werden, hab es seit dem einfach vermieden. Zumal ich Funktionspointer nicht mag.


Edit: Hab das jetzt erstmal so gelöst, dass ich an bestimmten Stellen void-Pointer verwende und dann an richtiger Stelle caste. Aber ich würd doch eigentlich gerne wissen, warum es nicht "sauber" ging.
<< an dieser Stelle ist eine Signatur verstorben >>

5

25.02.2009, 02:18

Zitat von »"the[V«

oid"]Meine mich zu erinnern, vor langer Zeit mal gelesen zu haben, Memberfunktionen könnten nicht über Funktionspointer angesprochen werden, hab es seit dem einfach vermieden. Zumal ich Funktionspointer nicht mag.

Der Grund ist einfach und Simpel: Der Funktionspointer kann nicht wissen, zu welchem Objekt er gehört. Denn wie soll eine Funktion auf die membereiner Klasse zugreifen, wenn sie nicht weiß, von welchem Objekt?

Klar kann man das irgendwie umgehen, man kann z.B. prima Static Methoden aufrufen (weil die ja keinem Objekt gehören) oder man kann auch Funktionsobjekte erstellen (eine Klassedie den operator() überlädt und wie eine Funktion benutzt werden kann, diese kann dann natürlich einen Zeiger auf das Objekt zu dem sie gehören soll speichern), aber nur mit Funktionszeigern geht es eben nicht.
Lieber dumm fragen, als dumm bleiben!

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

6

25.02.2009, 09:54

geht nicht, gibt es (nur ganz selten) nicht:

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
32
33
34
35
36
template<class Parent, class Container> void DeserializeIDToContainer(NetzwerkBuffer& buffer, Parent* obj, Container &Liste, void (Parent::*erasor)(typename Container::iterator), void (Parent::*adder)(unsigned int id))
{
    unsigned int            tID;
    unsigned int            count;
    std::list<unsigned int> idListe;

    buffer.Read(count);
    for(unsigned int counter = 0; counter < count; counter++)
    {
        buffer.Read(tID);
        idListe.push_back(tID);
    }

    for(typename Container::iterator temp = Liste.begin(); temp != Liste.end();)
    {
        bool found = false;
        for(std::list<unsigned int>::iterator it = idListe.begin(); it != idListe.end(); ++it)
        {
            if(*it == (*temp)->GetNetID())
            {
                found = true;
                idListe.erase(it);
                break;
            }
        }

        if(found)           ++temp;
        else if(erasor)     (obj->*erasor)(temp++);
        else                Liste.erase(temp++);
    }

    if(!idListe.empty())    _ASSERT(adder);

    for(std::list<unsigned int>::iterator it = idListe.begin(); it != idListe.end(); ++it)
        (obj->*adder)(*it);
}
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.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

25.02.2009, 10:30

iirc ging es im ursprünglichen Thread um die Verwendung einer Methode als Einsprungpunkt für einen Thread. In reinem C++, ohne Annahmen über die zugrundeliegende Plattform zu treffen geht das wohl direkt wirklich nicht...

Aber natürlich kann man z.B. einen Umweg über eine statische Methode und den Startup Parameter des Thread gehen:

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
32
33
34
35
36
37
38
class ThreadEntry
{
public:
  virtual DWORD main() = 0;
  virtual ~ThreadEntry() {};
};

class Thread
{
private:

  // ...


  static DWORD WINAPI ThreadProc(void* t)
  {
     return static_cast<ThreadEntry*>(t)->main();
  }

public:

  Thread(ThreadEntry& start);

  // ...


};

// ...


DWORD WINAPI Thread::ThreadProc(void* t)
{
  return static_cast<ThreadEntry*>(t)->main();
}

Thread::Thread(ThreadEntry& start)
{
  if ((handle = CreateThread(0, 0, &ThreadProc, &start, 0, &id)) == 0)
    throw error_creating_thread();
}


Da leitest du die Klasse des Objekts auf dem der Thread laufen soll einfach von ThreadEntry ab und implementierst die main() Methode und fertig...

Anonymous

unregistriert

8

25.02.2009, 10:59

ich mag boost::bind und boost::function 8)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

25.02.2009, 11:09

ja klar, damit gehts, in Verbindung mit boost::Thread natürlich auch...

10

25.02.2009, 11:20

Zitat von »"the[V«

oid"]Meine mich zu erinnern, vor langer Zeit mal gelesen zu haben, Memberfunktionen könnten nicht über Funktionspointer angesprochen werden, hab es seit dem einfach vermieden.


Hat zwar mit den Einsprungpunkten nichts zu tun, aber hier steht, wie man Pointer auf Memberfunktionen benutzt:

http://www.codeproject.com/KB/cpp/mem_fun_bind.aspx

Werbeanzeige