Pointerproblem
-
Hallo ich versuche gerade eine Art Baumstruktur zu implementieren.
Ich hab mir also ne Structure angelegt und ein paar Funktionen zum Arbeiten mit dem Baum eingebaut:
// TreeMemory.h: Schnittstelle für die Klasse TreeMemory. // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_TREEMEMORY_H__DD2A1C92_D23E_47EB_913D_1C1F36B94BB8__INCLUDED_) #define AFX_TREEMEMORY_H__DD2A1C92_D23E_47EB_913D_1C1F36B94BB8__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 struct TreeMember { CString bezeichnung; TreeMember *nextItem; TreeMember *firstChild; }; class TreeMemory { public: TreeMember GetNextItem(TreeMember element); CString GetText(TreeMember element); boolean HasNext(TreeMember element); TreeMember InsertItem(CString bezeichnung); TreeMemory(); virtual ~TreeMemory(); private: TreeMember *p_last; TreeMember *p_first; }; #endif // !defined(AFX_TREEMEMORY_H__DD2A1C92_D23E_47EB_913D_1C1F36B94BB8__INCLUDED_)Dazu der Code für die Klasse:
#include "stdafx.h" #include "stdafx.h" #include "TreeMemory.h" #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Konstruktion/Destruktion ////////////////////////////////////////////////////////////////////// /// @brief Dient zur Speicherverwaltung einer Hierarchischen Baumstruktur TreeMemory::TreeMemory() { p_first = 0; p_last = 0; } TreeMemory::~TreeMemory() { } /// @brief Ermöglicht es neue Elemente in den Baum einzubauen TreeMember TreeMemory::InsertItem(CString bezeichnung) { TreeMember *p_neu = new TreeMember; if (p_first == 0) { p_first = p_neu; p_last = p_neu; p_neu->bezeichnung=bezeichnung; p_neu->nextItem = 0; p_neu->firstChild = 0; } else { p_last->nextItem = p_neu; p_neu->bezeichnung = bezeichnung; p_neu->nextItem = 0; p_neu->firstChild = 0; p_last = p_neu; } return *p_neu; } boolean TreeMemory::HasNext(TreeMember element) { if (&element.nextItem == 0) { return false; } else { return true; } } CString TreeMemory::GetText(TreeMember element) { return element.bezeichnung; } TreeMember TreeMemory::GetNextItem(TreeMember element) { return *element.nextItem; }Soweit so gut. Bevor ich mit weiteren Sachen in Richtung Kinderknoten weitermachen wollte wollte ich erst mal testen.
Also folgender kleiner Test:
TreeMemory baum; TreeMember eins, zwei; CString text; eins = baum.InsertItem("Erstes Element"); zwei = baum.InsertItem("Zweites Element"); //zwei = baum.GetNextItem(eins); text = baum.GetText(zwei); MessageBox(text); if (baum.HasNext(eins)) { MessageBox("Erfolg"); }Funktioniert auch soweit, aber wenn ich in dem Test die auskommentierte Zeile wieder einkommentieren, dann kompiliert er zwar noch, aber ich erhalte ich die Fehlermeldung, dass ein Problem festgestellt wurde und beendet werden mußte. Problembericht senden... blablabla.
Ich vermute jetzt mal, dass ich mich so verhauen hab, dass ich irgendwo Speicher anspreche mit dem ich gar nix zu tun haben darf und will. Aber ich finde den Fehler nicht...
-
Habs mittlerweile selber rausgefunden:
Dadurch, dass ich beim Aufruf nicht die Adressen, sondern Objekte zurückgebe erzeugt das Programm Kopien des Objektes. Natürlich stimmen dann die Adressverlinkungen zwischen den einzelnen Elementen nicht mehr und die Pointer zeigen irgendwo hin.
Ist das jetzt verständlich?
Ich habs auf jeden Fall verstanden und wenns jemanden interessiert, dann poste ich noch den richtig gestellten Code.