Hallo Thomas!
int[] insert(string bitCode);
Das kann man machen.
in der cpp Datei:
int[] Tree::insert(string bitCode)
{
int adresses[2];
adresses[0] = -1;
adresses[1] = -1;
return adresses;
}
Und hier sage ich: Ouch! Inn[] ist dasselbe wie int*, ein Pointer auf
das nullte Element des Arrays. Und hier bekommst du das Problem, daß
du im Scope von Tree::insert() eine lokale Variable deklarierst
(addreses), einen Pointer auf sie zurückgibst und die Variable dann
out of scope gehen läßt (Speicher weg). Damit hast du einen Pointer
ins Nirvana, der etwas später sicherlich das ganze Programm auf die
Reise dorthin schicken wird (i.e. Absturz).
Zwei Möglichkeiten: Wenn es nicht gerade zeitkritisch ist, nimm std::
vector, das Vektor-Template aus der Standard Template Library.
Ist zwar langsam (vor allem die Implemenatation von Microsoft), aber
tut meistens. Wenn du aber Arrays benutzen willst, mach’s
folgendermaßen:
int * Tree::insert()
{
int * addresses = new int[2];
int[0] = int[1] = -1;
return addresses;
}
Du mußt dann nur daran denken, daß der Speicher irgendwo wieder
freigegeben werden muß.
Was ich daran allerdings unschön finde, ist das Design: Hier geht das
Ownership des Speichers von der Klasse Tree (die Methode insert hat
den Speicher besorgt) auf die aufrufende Methode über. Wenn die auch
in Tree liegt (bzw. insert private oder protected ist), ist das
vermutlich in Ordnung. Wenn ein Benutzer allerdings diese Methode
aufrufen kann, mußt du irgendwie sicherstellen, daß er den Speicher
wieder freigibt, und das ist gar nicht so einfach. Solltest du dann
ggf. anders kapseln, aber das wäre ein eigener Thread und hängt stark
von deinem restlichen Programm ab!
Viel Spaß noch mit Bäumen,
Chris