Verwalteter String in Klasse



  • Hallo,
    ich möchte in einer Klasse einen verwalteten String anlegen. Von Form1.h aus,
    soll man dann auf diesen String zugreifen können. So habe ich es versucht, aber es klappt leider nicht:

    Form1.h:

    #include "g_variablen.h"
    
    // ...
    
    g_variablen gvar;
    gvar.x = 50;
    gvar.y = 100;
    
    gvar.name = "dername";
    

    g_variablen.h:

    #include <String>
    
    #pragma once
    
    ref class g_variablen
    {
    public:
    	g_variablen(void);
    
    	int x;
    	int y;
    	String ^ name;
    };
    

    Könnt ihr mir sagen warum das nicht funktioniert ?

    Danke,
    mfg arena_blau

    ---------------



  • Könnt ihr mir sagen warum das nicht funktioniert ?

    Weil name eine managed referenz ist:

    gvar->name = "dername";
    

    Simon



  • Hallo,

    Weil name eine managed referenz ist:

    Da hast du recht, das hab ich übersehen.

    Wenn ich statt "name" das Wort "wert" schreibe, so z.B.:
    String ^ wert;

    dann funktioniert es aber immer noch nicht.

    Bei der Programmerstellung erhalte ich immer folgende Fehlermeldung:

    1>c:\dokumente und einstellungen\b\desktop\c\g_variablen.h(12) : error C2143: Syntaxfehler: Es fehlt ';' vor '^'
    1>c:\dokumente und einstellungen\b\desktop\c\g_variablen.h(12) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.

    Was mache ich da falsch ?

    Danke für eure Hilfe,
    mfg arena_blau

    ----------



  • Zeigmal exakt den Code der nicht funktioniert.

    Ausserdem ist #include <String> überflüssig. (Dieser Header kommt vom unmanaged Standard C++.).

    Simon



  • theta schrieb:

    Könnt ihr mir sagen warum das nicht funktioniert ?

    Weil name eine managed referenz ist:

    gvar->name = "dername";
    

    Simon

    Nein, gvar.name = "dername" ist korrekt. C++/CLI erlaubt die direkte Deklaration von Variablen vom Typ einer reference class ohne reference inklusive der dazugehörigen Semantik. Das Problem vielmehr dort zu suchen, WO er deklariert. Findet diese Deklaration auf global scope oder innerhalb einer Funktion statt? Mehr Code wäre nützlich 😉

    Und was soll dieses g_variablen(void) ? Nimm eventuell mal das void raus.

    MfG



  • /rant/ schrieb:

    theta schrieb:

    Könnt ihr mir sagen warum das nicht funktioniert ?

    Weil name eine managed referenz ist:

    gvar->name = "dername";
    

    Simon

    Nein, gvar.name = "dername" ist korrekt. C++/CLI erlaubt die direkte Deklaration von Variablen vom Typ einer reference class ohne reference inklusive der dazugehörigen Semantik. Das Problem vielmehr dort zu suchen, WO er deklariert. Findet diese Deklaration auf global scope oder innerhalb einer Funktion statt? Mehr Code wäre nützlich 😉

    Und was soll dieses g_variablen(void) ? Nimm eventuell mal das void raus.

    MfG

    Jupp korrekt. Habe schlecht hingeguckt.



  • Also ich hab den Code / das Projekt jetzt mal hochgeladen. Hier könnt ihr es runterladen:

    - http://s195130324.online.de/code.zip

    Danke,
    mfg arena_blau



  • Könnt ihr mir sagen warum das nicht funktioniert ?

    Sag mal was nicht geht.

    Poste den code, ich lad den nicht runter.
    Simon



  • Done. Du hast einfach den Namensraum nicht importiert, der Compiler kennt natürlich keine String Klasse. Es muss darum heissen:

    #pragma once
    
    ref class g_variablen
    {
    public:
        g_variablen(void);
    
        int x;
        int y;
        // System::String ;-)
        System::String ^ name;
    };
    

    Und alles kompiliert^^

    Sag mal was nicht geht.
    Poste den code, ich lad den nicht runter.
    Simon

    Windows Viren machen mir nix mehr aus :p

    MfG



  • Es ist einfach zuviel Aufwand, nicht wegen den Vieren, die machen mir auch nichts.
    Simon



  • Du hast einfach den Namensraum nicht importiert

    Du hast recht, darum hats nicht funktioniert. Jetzt funktioniert es.
    Danke nochmal für eure Hilfe.

    In der ZIP-Datei sind übrigens keine Viren enthalten. Ich wollte den Code nur nicht hier ins Forum stellen, da ich dachte, dass dies zu unübersichtlich wäre.
    Aber ich merks mir für meinen nächsten Beitrag.

    Danke,
    mfg arena_blau

    -------



  • Hallo,
    so, eine Frage hab ich jetzt noch.

    Wenn ich in einem button1_Click-Ereignis eine Instanz einer Klasse anlege,
    dann wird diese Instanz wieder gelöscht, sobald die Ereignisprozedur verlassen wird. Hier ein Beispiel:

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    				 g_variablen gvar;
    				 gvar.x = 10;
    				 gvar.y = 20;
    }
    

    Doch wie kann ich dies verhindern ?

    Die Instanz der Klasse soll also einmal angelegt werden, und dann so lange aktiv bleiben bis das Programm beendet wird.

    Habt ihr ne Idee wie man das macht ?

    Danke,
    mfg arena_blau

    ------------------------



  • Doch wie kann ich dies verhindern ?

    Du musst gvar als Member der Klasse machen.

    ref class Form1 : ....
    {
       private: g_variablen gvar;
    
       private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
       {
          gvar.x = 10;
          gvar.y = 20;
       }
    };
    

    Simon

    Edit:

    Die Instanz der Klasse soll also einmal angelegt werden, und dann so lange aktiv bleiben bis das Programm beendet wird.

    Im obigen Bsp. lebt gvar solange wie die Instanz der Form1 Klasse.



  • Hallo,
    es funktioniert, DANKE.


Anmelden zum Antworten