statische Klassenelemente
-
Hallo, ich hab eine Klasse namens CStatic:
/* CStatic.h */ class CStatic { public: CStatic(); static int m_Variable; }; /* CStatic.cpp */ #include "CStatic.h" CStatic::Cstatic() { m_Variable = 10; }
Nun habe ich diese in ein Form des BCB5Pro inkludiert:
#include "CStatic.h"
Wenn ich nun aber in einer beliebigen OnClick (oder halt irgendwas anderes) versuche auf die statische Variable zuzugreifen:
void __fastcall OnButtonClick(TObject* Sender) { Label1->Caption = CStatic::m_Variable; }
bekomme ich immer den Fehler: "Unresolved extern link error by linking UMainForm.OBJ ..."; Warum funzt das nicht??
-
Auf eine Klasse kannst Du nicht CStatic::m_Variable draufzugreifen.
sondern :
CStatic *pMyStatic = new Static(); Label1->Caption = pMyStatic->m_Variable; delete pMyStatic;
[edit]Nachtrag: Du darfst die Variable nicht als static deklarieren[/edit]
mfg
Dis[ Dieser Beitrag wurde am 05.06.2002 um 20:30 Uhr von Disrupter editiert. ]
-
THX !
-
Was wolltest Du eigentlich mit dem static erreichen ?
Wenn Du willst dass diese Variable niemand überschreiben darf dann kannst Du es so machen:class CStatic { public: CStatic(); int GetStaticVariable(); private: int iStatic; }; // ... cpp ... CStatic::CStatic() { iStatic = 50; } CStatic::GetStaticVariable() { return iStatic; } // ... CStatic * pStatic = new CStatic(); int myInt = pStatic->GetStaticVariable(); delete pStatic;
Hat aber alles eigentlich nichts mit BCB zu tun.
mfg
Dis
-
Das ist richtig denn der BCB behandelt sowas anders. Konnte mein Prob dennoch lösen!
-
Original erstellt von Hendrik Engler:
Das ist richtig denn der BCB behandelt sowas anders. Konnte mein Prob dennoch lösen!? Was behandelt er anders? Und wie konntest du denn dein Problem jetzt lösen?
-junix
-
Nun, rein theoretisch hätte meine erste Variante funktionieren sollen, denn so ist sie syntaktisch korrekt in der C++ Sprachdefinition festgelegt und in einem normalen C++ Compiler (bzw. DOS) funktionierte das Beispiel ja auch.
Der BCB5Pro aber scheint die Informationen und die Syntaxschreibweise wie "CStatic::Variable" anders auszuwerten oder aber er kommt bei der Compilierung in einen Konflikt mit den Klassen wie "TForm1", welche ja auch in zwei Dateien (.h / .cpp) aufgeteilt und inkludiert sind.
Meine erste Variante war ja das Gleiche Prinzip nur der BCB linkt diese Art von Syntax nicht und verheddert sich immer.
Mein Problem hab ich jetzt so gelöst das ich die statischen Variablen direkt außerhalb der Klasse gleich initialisiert habe (auch nach Standard):
class CStatic { public: static int Var; }; int CStatic::Var = 20;
Hätte ich meine erste Variante und die über den Konstruktor verwendet dann käme wieder dieser Linkerfehler.
-
Der BCB verhält sich hier schon normgerecht, da die Zeile
static int m_Variable;
nur die Variable deklariert.
Du musst sie dann noch mit
int CStatic::m_Variable;
definieren. So ist auch das Beispiel unter 3.1 der C++ANSI-Norm aufgebaut:
[cpp]
int a; // defines a
extern const int c = 1; // defines c
int f(int x) { return x+a; } // defines f and defines x
struct S { int a; int b; }; // defines S, S::a, and S::b
struct X { // defines X
int x; // defines nonstatic data member x
**static int y; // declares static data member y
**X(): x(0) { } // defines a constructor of X
};
**int X::y = 1 // defines X::y;
**enum { up, down }; // defines up and down
namespace N { int d; } // defines N and N::d
namespace N1 = N; // defines N1
X anX; // defines anX[/cpp]
[ Dieser Beitrag wurde am 06.06.2002 um 17:53 Uhr von Geo editiert. ]
-
Um noch einmal auf diesen Thread zurückzukommen. Ich habe mich an obenstehende Angaben gehalten, habe auch den Code 1:1 übernommen und versucht zu kompilieren. Allerdings bekomme bei folgendem Code
class CStatic
{
public:
static int Var;
};int CStatic::Var = 20;
folgenden Fehler entgegengeworfen:
[C++ Error] main.cpp(30): E2089 Identifier 'Var' cannot have a type qualifier
Ich habe leider nicht den blassesten Dunst, wie ich diesen Fehler vermeiden kann. Könnt Ihr mir weiterhelfen?
-
Original erstellt von <HeAvY_T>:
int CStatic::Var = 20;...und du bist dir sicher?
-junix
-
Ja, ich bin mir sicher.
Gehen wir die Sache mal von einer anderen Seite an. Ich erstelle im C++ Builder ein neues Projekt, eine ganz einfache Standard-Applikation. Dort füge ich den Code ein, damit das dann so aussieht:class CStatic { public: static int Var; }; void __fastcall TForm1::FormCreate(TObject *Sender) { int CStatic::Var = 20; }
Liegt vielleicht da schon mein Fehler oder müsste das so gehen? Naja, bei mir geht's jedenfalls nicht. Habt Ihr ein paar Tipps, was ich noch probieren könnte? Mir gehen allmählich jegliche Ideen aus
Thx
-
Was willst du denn jetzt da machen? Eine Variable deklarieren oder ihr einen Wert zuweisen?
-junix
-
hmm... ich möchte einfach nur in diese statische Variable schreiben sowie daraus lesen können. Naja, mal sehen. Vielleicht finde ich eine andere Möglichkeit, meinen Wert zu speichern.
-
Überleg mal: wie schreibst/liest du eine Variable im Quelltext normalerweise?
-junix
-
Also, ich mach mal eine ausführliche Beschreibung.
Ich habe ein Programm geschrieben, das von einer Klasse mehrere Instanzen erstellt, um damit zu arbeiten. Jetzt möchte ich quasi eine Variable haben, die mir die Instanz zurückgibt, die gerade ausgewählt ist. D.h. es gibt eine MouseDown Methode innerhalb der Klasse (brauche ich, wegen dynamischer Erzeugung einiger Komponenten), in der die Variable auf die aktuell angeklickte Instanz gesetzt werden soll.
Nun soll aber auch von der Form aus, über die ich die Instanzen der Klasse erstelle, die Möglichkeit bestehen, auf diese Variable zuzugreifen, um zu erfahren, welches Objekt gerade ausgewählt wurde.
Dies wollte ich eben mit einer statischen Klassenvariable lösen, die den gleichen Typ annimmt, der durch die Klasse selbst definiert wird.Nun, denn... mit
CStatic::Var = 20;
oder CStatic.Var = 20;
oder CStatic->Var = 20;
oder wie auch immer, geht's nicht, weil ich den oben erwähnten Linker-Error bekomme.
-
Original erstellt von <HeAvY_T>:
CStatic::Var = 20;Aha. Du hattes aber geschrieben:
int CStatic::Var = 20;
Das ist ein Unterschied!
-
Ja, aber es geht beides nicht.
Schreibe ich das, wie im letzten Post angegeben, gibt es einen Linker-Error, der schon weiter oben in diesem Thread aufgetaucht ist.
-
Natürlich geht das nicht.
CStatic stat; stat.Var = 20;
-
Ich habe das Problem jetzt auf andere Art und Weise ohne statische Variable gelöst.
Trotzdem vielen Dank!