void zeiger csting problem



  • hallo leute,

    folgendes Problem ich habe einen void zeiger und moechte ihn auf ein objekt zeigen lassen nur wenn ich das mache kommt die Fehlermeldung:

    error: ‘void*’ is not a pointer-to-object type

    Der Code :

    struct data_t 
    {
      unsigned long patientID;
      unsigned applicationState;
      void *data;
    };
    
    data_t data= new data_t();
    
    TabWidget *mainWidget = new MainWidget();
    
    data->data = mainWidget;
    

    Wo liegt hier der Fehler?



  • du kannst das object vorher zu void* casten .. was das bringen soll ist mir aber rätselhaft .. woher weisst du später welche art object in dem struct steckt ... und wenn da eh nur eine Art reinkann, warum nimmste dann nicht nen pointer auf den richtigen Typ oder in deinem fall vielleicht den widget-basistypen wenn das alles so widgetdinger sind?



  • Ich tue das um Abhaengigkeiten loszuwerden. Den dieses objekt wird von dynamisch geladenen plugins genutzt und so koennen diese plugins daten miteinander austasuchen ohne das die anwendung die klasse kennen muss.

    Das casten habe ich schon versucht ohne erfolg.

    gruss mosta



  • Lass es mich mal so ausdrücken: Du machst etwas falsch 😉

    #include <string>
    using namespace std;
    
    struct data_t
    {
      unsigned long patientID;
      unsigned applicationState;
      void *data;
    }data;
    
    int main()
    {
    	string* bar = new string();
    	data.data = bar;
    	delete bar;
    }
    

    Kompiliert mit VS 2008 und Comeau.



  • Hmm, irgendwie kompiliert er das bei mir immer noch nicht. Aber ich hab den beispiel code auch nicht richtig geposted den das data objekt liegt auf dem stack.

    also

    data_t *data = new data();
    

    Michael E. schrieb:

    Lass es mich mal so ausdrücken: Du machst etwas falsch 😉

    Was meinst du damit?



  • mosta schrieb:

    dieses objekt wird von dynamisch geladenen plugins genutzt und so koennen diese plugins daten miteinander austasuchen ohne das die anwendung die klasse kennen muss

    Ok .. also musst du -statt es typsicher durchzureichen- das Ding dann per reinterpret_cast umbiegen danmit du es wieder verwenden kannst und sparst dir dadurch das Linken gegen die libs/includes die die Apllikation benutzt beim erstellen einer/diverser Pluginlibs?



  • padreigh schrieb:

    mosta schrieb:

    dieses objekt wird von dynamisch geladenen plugins genutzt und so koennen diese plugins daten miteinander austasuchen ohne das die anwendung die klasse kennen muss

    Ok .. also musst du -statt es typsicher durchzureichen- das Ding dann per reinterpret_cast umbiegen danmit du es wieder verwenden kannst und sparst dir dadurch das Linken gegen die libs/includes die die Apllikation benutzt beim erstellen einer/diverser Pluginlibs?

    Mein Problem liegt nicht beim benutzen des objekts, sondern erstmal beim setzen des objekt zeigers auf den void pointer.

    gruss mosta



  • Versuch es mal mit reinterpret_cast<void *>(mainWidget)



  • ,,,, schrieb:

    Versuch es mal mit reinterpret_cast<void *>(mainWidget)

    Wie ich schon geschrieben habe. Hatte ich das schon ausprobiert. So wie ich die Fehlermeldung lese muss der Fehler in der adressierung des void zeigers liegen.

    gruss mosta



  • Versuch mal deine Variablen etwas umzubennen. Vielleicht kommt der Compiler mit void *data und data_t *data durcheinander. Welchen Compiler nutzt du überhaupt?



  • Also bei nem Kumpel compiled er mit reinterpret_cast<void *>(mainWidget) ohne Probs.



  • mosta schrieb:

    Michael E. schrieb:

    Lass es mich mal so ausdrücken: Du machst etwas falsch 😉

    Was meinst du damit?

    Dass es bei mir mit VS 2008 und Comeau kompiliert wird, wenn ich wxWidgets außen vor lasse (weil ich es nicht habe). Hast du den von mir geposteten Minimalcode (ggf. in nem neuen Projekt) probiert?



  • Michael E. schrieb:

    mosta schrieb:

    Michael E. schrieb:

    Lass es mich mal so ausdrücken: Du machst etwas falsch 😉

    Was meinst du damit?

    Dass es bei mir mit VS 2008 und Comeau kompiliert wird, wenn ich wxWidgets außen vor lasse (weil ich es nicht habe). Hast du den von mir geposteten Minimalcode (ggf. in nem neuen Projekt) probiert?

    Ja und da kompiliert er es. Ich versteh nicht was er meint mit "void* is not a pointer-to-object type".

    Mein kompiler ist der gcc 4.3.3



  • Aah hab den Fehler gefunden. Habe das falsche objekt benutzt. Das kommt davon wenn man variablen namen zu oft wieder benutzt.

    gruss mosta


Anmelden zum Antworten