C++ statische Variable

iks-deh

Lt. Commander
Registriert
Jan. 2011
Beiträge
1.325
Hi,
ich weiß, keine Hausaufgaben-Fragen hier ;).

Trotzdem hab ich bei einer Übung gerade ein Problem, es geht mehr um das Verständnis als eine konkrete Lösung. C++ macht mich noch wahnsinnig.

Und zwar sieht meine Klasse (vereinfacht) so aus:

Code:
class Klasse
{
Klasse(void);
~Klasse(void);

static void MachEtwas(char t)
{
array[0] = t;
}

static char buffer[20];
}

Wenn jetzt in einer anderen Klasse die statische Methode aufgerufen werden soll, kompiliert mein Code nicht mehr.

" LNK2001: Nicht aufgelöstes externes Symbol ""public: static char * Klasse::buffer" (?buffer@MainMemory@@2PADA)"."

Wird der Aufruf der MachEtwas-Methode auskommentiert, kompiliert das Ganze.

Ich hoffe jemand hat einen Tipp für mich.

Ich bin mal eine Rauchen...
 
Zuletzt bearbeitet:
C-Mann hier, deshalb kann ich mich täuschen, aber zumindest in C werden static-Funktionen nicht exportiert.
 
Das heißt ^^?

Ich habe mittlerweile den Verdacht dass es mit den Includes zusammenhängt.
In einer 3. Klasse Erzeuge ich zwei Instanzen der zwei Klassen (die mit der statischen Methode und die, die sie aufruft) und lasse dann lasse dann die statische Methode aufrufen. Könnte es daran liegen?

edit: Alleine der Aufruf der statischen Methode führt zum Fehler, daran liegt es wohl nicht.
 
Zuletzt bearbeitet:
Puh ist zwar schon lange her mit C++, aber ich kann mich an keine Funktion erinnern, die so aufgebaut war wie deine "MachEtwas" Funktion. 1. besitzt diese Funktion keinen Rückgabewert und zweitens habe ich noch nie etwas von einem Rückgabetyp "static" gelesen.

Vielleicht solltest du dir nochmal den Aufbau eines Funktionskopfes anschauen und überlegen, wie dieser an den Rückgabetyp der Funktion angepasst werden muss.

Anscheinend fehlt eine Angabe, welche das ist verrate ich dir aber nicht. Hier kannst du nachschauen, wie es aussehen sollte.
 
Eine konkrete Fehlermeldung zu unkonkretem Code ist immer schlecht. So kann man schlecht sagen, wo der Fehler herrührt. Schau mal, dass du etwas mehr Kontext beibringst und insbesondere deine Datentypen und Qaulifizierer genau mit angibst.
 
Oh, Rückgabetyp ist void, hab es vergessen hinzuschreiben.

Nach weiterm googlen hab ich eine Lösung gefunden, und zwar das Array ausserhalb der Klasse zu definieren. Allerdings bin ich mir nicht sicher ob das so ganz richtig ist.

edit: Ok, hier mal die komplette Klasse:

Code:
class TestClass
{
public:
	TestClass(void);
	~TestClass(void);

	static void* Alloc(size_t Size)
	{
		char test = 1;
		buffer[2] = test;

		return 0;
	}
	static void* Free(void * _PAllocation)
	{
		return 0;
	}

private:
	static char buffer[10];
};

Die Rückgabetypen der Methoden Alloc und Free sollten nicht von Interesse sein, es knallt schon wenn im Code einfach nur Alloc aufgerufen wird.
 
Zuletzt bearbeitet:
Wie kann ich dann von statischen Methoden auf ein Member der Klasse zugreifen?
 
Code:
// die Klasse mit dem statischen Member
class Klasse {
   static char array[100]; // das ist nur eine DEKLARATION
public:
    Klasse() { };
   ~Klasse() { };
   // statische Funktionsmember koennen nur 
   // auf statische Datenmember zugreifen
   static void MachEtwas(char t)  {  array[0] = t; }
};

// da der Member nur einmal (ausserhalb konkreter Klasseninstantiierungen)
// existiert, musss er hier instantiiert werden:
char Klasse::array[];

 int main(int argc, char*argv[])
{
 Klasse k;
 // Aufruf statische Funktion ueber Klasseninstanz (geht auch)
 k.MachEtwas('A');
 // Aufruf statische Funktion OHNE Klasseninstanz
 Klasse::MachEtwas('B');
}
 
Zuletzt bearbeitet: (code addition)
Wenn ich das "char Klasse::array[];" ausserhalb der Klasse hinzufüge, meckert der Compiler wegen Mehrfach-Definition der Variablen .

edit: Ok, habe es von der Header-Datei in die .cpp verlegt, jetzt kompiliert er schon mal :).

Verfluchtes C++ ^^.

Danke nochmal an alle, die sich meinem Problem angenommen haben :).
 
Zuletzt bearbeitet:
Code:
class TestClass
{
public:
	TestClass(void);
	~TestClass(void);

	static void* Alloc(size_t Size)
	{
		char test = 1;
		buffer[2] = test;

		return 0;
	}
	static void* Free(void * _PAllocation)
	{
		return 0;
	}

private:
	static char buffer[10];
};

In deinem Beispiel wird das Array nur statisch deklariert, es ist aber noch nicht definiert:

char TestClass::buffer[10]

Die Definition gehört in die dazugehörige .cpp
Ergänzung ()

Du musst die Fehlermeldung schon lesen.

Deine Mehrfachdefinition kommt daher weil die Deklaration und Definition unterschiedlich ist:

"char array[100]" vs "char Klasse::array[]"
 
Ergänzung vom 19.12.2012 00:34 Uhr: Du musst die Fehlermeldung schon lesen.

Deine Mehrfachdefinition kommt daher weil die Deklaration und Definition unterschiedlich ist:

"char array[100]" vs "char Klasse::array[]"

Glaube den Unterschied hatte ich noch nicht ganz raus, ich hoffe ich stolper nicht nochmal drüber.
 
wusu schrieb:
Deine Mehrfachdefinition kommt daher weil die Deklaration und Definition unterschiedlich ist:

"char array[100]" vs "char Klasse::array[]"

Nee nee, das war schon ganz richtig ;-)

Daher kommt es nicht. Er hat den Fehler selber rausgefunden (mehrfache Inkludierung von Headern).
 
Zurück
Oben