Zugriff auf Klassen Variable



  • Hallo

    habe folgendes Problem.

    #ifndef Unit2H
    #define Unit2H
    class Test
    {
    	public:
    	static unsigned int A;
    	static void Temp();
    
    };
    #endif
    
    #pragma hdrstop
    #include "Unit2.h"
    #include "Unit1.h"
    #pragma package(smart_init)
    
    void Test::Temp(void)
    {
    	A = 10;
    	Form1->Edit1->Text = A;
    
    }
    

    Hier Rufe ich nun die Funktion Temp auf.

    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
    	Test::Temp();
    }
    

    Es kommt dann die Fehlermeldung Unresolved external Test::A vom Linker.

    Ist die Variable nicht static kann ich sie nur in einem Objekt benutzen,
    welches ich aber nicht instanzieren möchte.



  • Hallo hermes,

    eine statische Klassenvariable musst Du noch ausserhalb der Klasse definieren:

    #ifndef Unit2H
    #define Unit2H
    class Test
    {
        public:
        static unsigned int A;
        static void Temp();
    
    };
    
    unsigned int Test::A; //<<-- Hier
    #endif
    
    #pragma hdrstop
    #include "Unit2.h"
    #include "Unit1.h"
    #pragma package(smart_init)
    
    void Test::Temp(void)
    {
        A = 10;
        Form1->Edit1->Text = A;
    
    }
    
    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
        Test::Temp();
    }
    

    Gruß Peter.



  • Hallo Peter24,

    vorweg es funktioniert.

    Da ich hautsächlich in C Programmiere finde ich
    das ein wening ungewöhnlich.

    Unter C setz man mit dem Schlüsselwort "extern" einen Platzhalter für den Linker der dann beim linken die Addresse der Variable einsetzt.

    Hier sieht es aber so aus als ob ich eine weitere Instanz
    ausserhalb der Klasse instanziere.

    Zumal man sich da ja auch einen Ast abschreibt (alles doppelt)

    Warum kennt der Linker nicht die Adresse der static instanzierten Variable A?

    Das sagt doch die Fehlermeldung "unresolved external" aus. oder ?



  • Bei statischen Klassenmembervariablen ist es ähnlich wie mit extern. Das in der Klasse ist nur eine Deklaration. Damit weiß der Compiler nur, dass es diese Variable gibt. Die Definition fehlt noch.


Anmelden zum Antworten