std::Map fuer managed type



  • Ähm ich würde das so machen:

    public ref class MyClass {
    
    public:
    
        System::Collections::Generic::Dictionary<String^,String^> ^Containername;
    
        MyClass::MyClass() {   
             Containername = System::Collections::Generic::Dictionary<String^,String^>;
        }
    };
    

    So in etwa^^



  • ok ich versuchs mal so ähnlich...

    wobei die Map oder Colletion wie auch immer man es dann bezeichnet, kein Attribut der Klasse sein soll, sondern eine globale Variable!

    vieleicht sollte ich noch dazu sagen, daß es schön wär wenn das am Ende mit den Datentypen <jobject, MyClass^> klappen würde... auf den ersten blick tut es das nämlich auch nicht 😡

    global or static variable may not have managed type 'System::Collections::Generic::Dictionary<TKey,TValue>'
    


  • Erklär doch mal kurz dein Vorhaben.

    @ wobei die Map oder Colletion wie auch immer man es dann bezeichnet, kein Attribut der Klasse sein soll, sondern eine globale Variable!

    Wenn ich dich richtig verstanden habe: Map bzw Dictionary ist doch dann ne Variable !?
    Ich bschreib dir gleich mal kurz ein Code-Beispiel^^

    Edit:
    Gib mir doch mal bitte deinen Code^^



  • 1. Managed typen können nicht global sein. Übergib halt das managed Handle wo es nötig ist.
    2. Nimm Dictionary (wie schon erwähnt). Das ist das managed pendant zu std::map. In einer native Klasse können nicht ohne weiteres managed Typen "enthalten" sein.

    Simon

    Edit
    Es gibt noch die STL/CLR:
    http://msdn.microsoft.com/en-us/library/bb385954.aspx
    Ich persönlich würds jedoch mit den Framework Klassen machen.



  • also folgendermaßen sieht es grob aus... zumindest stelle ich mir es so momentan vor.

    Map<jobject, MyClass>

    //JNI call
    create()

    //JNI call
    destroy()

    MyClass() {

    }

    Ich arbeite mit JNI, spreche also aus meiner Java Klasse einzelne Funktionen aus der dll an, die oben schematisch dargestellt ist. Wenn ich von einem Objekt meiner Java Klasse einen create() Befehl in der DLL aufrufe dann würde ich gerne ein Objekt von MyClass erzeugen. Destroy analog.. damit ich aber überhaupt beim destroy weiss, zu welchem Java Objekt mein Native Objekt gehört brauche ich sowas wie eine Map... wenn ihr bessere Vorschläge habt schießt los



  • hm mal ne blöde Frage.

    wieso geht das nicht so??

    public ref class MyClass{

    public:
    MyClass::MyClass() {
    Dictionary<String,MyClass> dict= gcnew Dictionary<String,MyClass>();
    dict.add("test", this);
    }
    };

    mit <String^, String^> o.ä. geht es ebenfalls nicht... hab ich da irgendwas vergessen?

    error C2039: 'add' : is not a member of 'System::Collections::Generic::Dictionary<TKey,TValue>'



  • Weil es Add(..) und nicht add(..) heisst.



  • Jep !
    Das ist zeimlich oft ein Fehler^^
    Würde dir Visual Studio empfehlen, falls du´s noch nicht hast...

    Eingebaute IntelliSense-Funktion, gibt dir alle Elemente der ausgewählten Klasse !

    Mfg



  • hm danke 😉

    ja ich hab das eigentlich, auch das inteli sense ... vieleicht nicht richtig konfiguriert .. ich krieg normal ne Liste aber bei dem Dictionary kommt gar nix deshalb war ich etwas verwirrt. Auch sonst beinhaltet die Liste Einträge die einem nix bringen... ist das normal`?



  • Jo ist normal^^
    Windows halt 😃

    Manchmal musst du etwas warten, bis die Vorschläge angezeigt werden.
    Manchmal hat VS auch garkein Bock die Dinger anzuzeigen, also nicht wundern, einfach mal ausprobieren und wenn mal wieder sowas wie:

    error C2039: 'add' : is not a member of 'System::Collections::Generic::Dictionary<TKey,TValue>'
    

    angezeigt wird, einfach mal schreibweise ändern^^


Anmelden zum Antworten