Wer kann mir hier behilflich sein?
Also hier hänge ich.
http://www1.minpic.de/bild_anzeigen.php?id=78988&key=42868607&ende
Error 1 error C2440: '=' : cannot convert from 'void
(__thiscall
CRMessageMapTest::* )(void)' to 'PFNVOID'
c:\messagemap\rmessagemap\rmessagemap\rmessagemaptest.cpp
58 RMessageMap
Ist doch das gleiche, oder?
PFNVOID m_func;
void *m_func_test;
Was müsste ich tun, wenn ich das benötige?
Funktion(en) double pMyFunc (int v1, float v2, double
v3,
CString v4, char v5)
Was wird da mit der 'schnellen' Schreibweise gemeint?
asdispatch[] =
{
1, &CRMessageTest::func1,
2, &CRMessageTest::func2,
Geht leider auch nicht.
Danke für Eure Hilfe.
Grüße Claudia Maier
H
#pragma once
//typedef void (*PFNVOID)(void);
typedef void (*PFNVOID)();
class CRMessageMapTest
{
private:
struct S_MYTAB
{
int m_Id;
PFNVOID m_func;
void *m_func_test;
};
S_MYTAB asdispatch[4];
public:
CRMessageMapTest(void);
~CRMessageMapTest(void);
void func1(void);
void func2(void);
void func3(void);
void func4(void);
void Start(void);
void Init(void);
};
CPP
#include "StdAfx.h"
#include "RMessageMapTest.h"
CRMessageMapTest::CRMessageMapTest(void)
{
}
CRMessageMapTest::~CRMessageMapTest(void)
{
}
void CRMessageMapTest::func1(void)
{
AfxMessageBox("M 1");
}
void CRMessageMapTest::func2(void)
{
AfxMessageBox("M 2");
}
void CRMessageMapTest::func3(void)
{
AfxMessageBox("M 3");
}
void CRMessageMapTest::func4(void)
{
AfxMessageBox("M 4");
}
void CRMessageMapTest::Start(void)
{
int iId;
iId = 3;
for ( int i=0; i<sizeof(asdispatch)/sizeof(asdispatch[0]); ++i )
{
if ( asdispatch[i].m_Id == iId )
{
asdispatch[i].m_func();
break;
}
}
}
void CRMessageMapTest::Init(void)
{
// ** Wie würde die 'schnelle' Schreibweise gehen?
/* asdispatch[] =
{
1, &CRMessageTest::func1,
2, &CRMessageTest::func2,
3, &CRMessageTest::func3,
4, &CRMessageTest::func4
} */
asdispatch[0].m_func = &CRMessageMapTest::func1;
/* asdispatch[1].m_func = &CRMessageMapTest::func2;
asdispatch[2].m_func = &CRMessageMapTest::func3;
asdispatch[3].m_func = &CRMessageMapTest::func4; */
// asdispatch[0].m_func_test = &CRMessageMapTest::func1;
/* asdispatch[1].m_func_test = &CRMessageMapTest::func2;
asdispatch[2].m_func_test = &CRMessageMapTest::func3;
asdispatch[3].m_func_test = &CRMessageMapTest::func4; */
asdispatch[0].m_Id = 1;
asdispatch[1].m_Id = 2;
asdispatch[2].m_Id = 3;
asdispatch[3].m_Id = 4;
> Error 1 error C2440: '=' : cannot convert from 'void
> (__thiscall
> CRMessageMapTest::* )(void)' to 'PFNVOID'
> c:\messagemap\rmessagemap\rmessagemap\rmessagemaptest.cpp
> 58 RMessageMap
__thiscall ist etwas ungewohnt.
Das deutet wohl darauf hin, da� der Zeiger auf die Instanz nicht
untergebracht werden kann. I.d.R. kann man so etwas mit
std::tr1::function in den Griff bekommen, oder durch den expliziten
Einsatz von pointer-to-member-function-Variablen.
> ich benötige eine MessageMap.
Was ist das?
> Wer kann mir hier behilflich sein?
>
> Also hier hänge ich.
> http://www1.minpic.de/bild_anzeigen.php?id=78988&key=42868607&ende
Ich auch. Ich sehe ein Bild mit dem Text "www.MinPic.de\nDirekter
Link!".
> Error 1 error C2440: '=' : cannot convert from 'void
> (__thiscall
> CRMessageMapTest::* )(void)' to 'PFNVOID'
Der Compiler sagt, er könne einen Zeiger auf Memberfunktion nicht nach
PFNVOID umwandeln.
Wenn das
> typedef void (*PFNVOID)();
die Deklaration von PFNVOID ist, besteht das unmittelbare Problem
darin, dass Zeiger auf Memberfunktionen und Zeiger auf
Nichtmemberfunktionen nicht das geringste miteinander zu tun haben.
> Ist doch das gleiche, oder?
> PFNVOID m_func;
> void *m_func_test;
Nein. Das eine ist ein Zeiger auf eine Nichtmemberfunktion mit leere
Parameterliste und Rückgabetyp void, und das andere ein Zeiger auf
void. m_func und m_func_test haben sehr wenig gleiches an sich.
> Was müsste ich tun, wenn ich das benötige?
> Funktion(en) double pMyFunc (int v1, float v2, double
> v3,
> CString v4, char v5)
Ich verstehe die Frage nicht. Wozu benötigst Du was?
Poste doch mal eine Beschreibung des Problems, welches Du mit Deinem
Code lösen willst. Dann hast Du auch die Chance, bessere Rückmeldungen
zu kriegen als mein Flickwerk :-)
Der Fehler liegt in der Struct.
> struct S_MYTAB
> {
> int m_Id;
>>>>> PFNVOID m_func; <<<<<<<
> void *m_func_test;
> };
>
PFNVOID ist so viel ich von der Windows Welt weis ein Normaler Pointer auf
eine Funktion. Du versuchst aber eine Member Funktion einer Classe in
diesen Pointer zu bekommen. Das geht nicht.
Hier eine Mᅵglichkeit.
class cMachWas
{
public:
void fuereAus(QAction *p);
private:
void func1();
void func2();
/*
Als Struktur wᅵrde das so aussehen
struct fPtr
{
int id;
void (cMachWas::*mFuncPtr);
};
*/
// ich benutze aber die map weil ich faul bin :-)
std::map< QAction*, void (cMachWas::*) >
mFuncMap;
};
Wichtig: Aufruf geht nur wenn eine dazupassende Class vorhanden ist !!
Dir Funktion fuereAus sieht dann so aus:
void cMachWas::fuereAus(QAction *p)
{
(this->*mFuncMap[p])();
/*
wenn nicht sicher ist op p auch exestier dann bitte vorher prᅵfen
*/
}
wichtig ist das this, wᅵrde aber auch mit jeder ixbeliebigen class von
cMachWas gehen.
Mario