Gültigkeit von Objekten?
-
Hallo
Ich hab ne Frage, ich hab eine Klasse von der ich ein Objekt erstellt habe in meinem Hauptprogramm, dann ruf ich eine Methode von diesem Objekt auf also z.B.
Objekt->getCode(VLObj *firstObjPointer);
Die Methode erstellt nun eine Verkettete Liste mit weiteren Objekten einer anderen Klasse mittels z.B.:
nextElement = new VLObj;Die Adresse des ersten Elements der Verketteten Liste soll nun in dem übergebenen Pointer abgelegt werden.
So nun ist ja dann irgendwann die Methode "getCode" zu ende und es geht im Hauptprogramm weiter, aber bleibt jetzt die Verkttete Liste die mittels dem Operator new aufgebaut erhalten, oder werden die Elemente der Verketteten Liste nach beendigung der Methode "getCode" automatiosch freigegeben? wenn ja wie kann ich das verhindern??
Hab ein solches Programm geschrieben, und innerhalb der Methode kann ich wunderbar drauf zugreifen, aber sobald ich im Hauptprogramm bin steht in firstObjPointer nichts mehr.Gruß
Maruu
-
So wie du es beschreibst muss es eigentlich gehen. Per new angelegte Objecte bleiben im Speicher, bis du sie per delete wieder freigibst.
Nur Instanzen würden nach Beendigung der Methode zerstört werden.Hast du vielleicht einen Ausschnitt?
-
Den kann ich leider erst heute Abend liefern da bin ich wieder zu hause.
Aber danke schonbmal für die Antwort, ich meld mich heute Abend nochmal.Gruß
Maruu
-
Das heisst ich hab hier ein Schmierblatt mit dem Programm dabei, das tipp ich schnell mal ab:
Hauptprogramm:
VLObj * firstPointer;
SourceObj *Source;
Source = new SourceObj;Source->SetSource("Spalte1,Spalte2,Spalte3,");
Source->getCode(",", firstPointer);Zur Erklärung, der mit SetSource übergebene Wert(wird dann in der internen Objektvariable "Code" gespeichert) soll am Trennzeichen(hier ","), das mit getCode übergeben wurde, getrennt werden und in der Verketteten Liste abgelegt werden.
Methode getCode:
VLObj *nextObj, *newObj;
int NumCol = 0, PosCol=-1;while(PosCol){
nextObj=newObj;
newObj= new VLObj;
if(NumCol==0)
{
nextObj=newObj;
firstObj=newObj;
PosCol=Code.AnsiPos(Trennzeichen);
}
newObj->setSpalte=Code.substr(1,PosCol);
Code.delete(1,PosCol+strlen(Trennzeichen));
PosCol=Code.AnsiPos(Trennzeichen);NumCol++;
newObj->InsertObj(nextObj);
}So zur erklärung die While Schleife wird solange durchlaufen bis kein Trennzeichen (hier das übergebene ",") mehr gefunden wird. Beim ersten
Durchlauf wird die Adressen des Ersten Elements der Verketteten Liste
firstObj zugewiesen. Danach wird die Verkettete Liste befüllt mit dem String
der zwischen den Trennzeichen steht. am Schlüss wird mitgezält wieviele
Elemente in der Verketteten Liste sind, mittels "NumCol++" und es wird ein neues Element in die Verkettete Liste eingefügt.Die Methode Insert Obj sieht so aus:
void InsertObj(VLObj * behindObj)
{next='\0';
behindObj->setNext=this;
}Diese Methode fügt hinter dem bisher letzten Objekt das übergeben wird (hier nextObj) in weiteres Element der Verketteten Liste ein (hier newObj) und Lässt dann das letzte Element der Verketteten Liste auf '\0' zeigen. "next" ist ein Pointer der in jedem Objekt der Klasse VLObj existiert und auf das jeweils nächste Element in der Verketteten Liste zeigt.
So naja ich hoffe es kapiert einer
Gruß
Maruu
-
hat keiner eine Idee???
Hab das ganze nochmal vereinfacht:
void getCode(AnsiString Trennzeichen, VLObj * firstObj){
VLObj *nextObj, *newObj; int NumCol = 0, PosCol=-1; while(PosCol){ nextObj=newObj; newObj= new VLObj; if(NumCol==0) { nextObj=newObj; firstObj=newObj; PosCol=Code.AnsiPos(Trennzeichen); } newObj->setSpalte=Code.substr(1,PosCol); Code.delete(1,PosCol+strlen(Trennzeichen)); PosCol=Code.AnsiPos(Trennzeichen); NumCol++; nextObj->setNext(newObj); newObj->setNext('\0'); } }
Und aufgerufen wirds mit
VLObj * firstPointer; SourceObj *Source; Source = new SourceObj; Source->SetSource("Spalte1,Spalte2,Spalte3,"); Source->getCode(",", firstPointer);
Gruß
Maruu
-
Hi
benutz doch mal bitte die Code-Tags des Forums. dafür sind die gemacht .... denn so wird sich kaum einer mal deinen Code anschauen.
mfg