Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Strukturen während des ganzen Programms verfügbar machen.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.10.2005, 18:32 Uhr
~Ankatrin
Gast


Hallo, ich habe folgende Struktur für eine verkettete Liste:

clTreeStruct.h

C++:
typedef struct baum            
{
    int inhalt;                // speichert den Namen.
    baum *pnaechster;
    baum *pvorgaenger;        // Zeiger auf die nächste tree Struktur.
}baum;

class clTreeStruct
{
public://Methoden
    clTreeStruct(void);
    ~clTreeStruct(void);
    void AddItem(int zahl);
    void PrintAll(void);
    void DeleteAllItems(void);
    int Test(void);
    int GetBack(void);
    baum *anker;
    baum *pWorker;
};


clTreeStruct.cpp

C++:
#include "StdAfx.h"
//#include ".\cltreestruct.h"
#include "clTreeStruct.h"



clTreeStruct::clTreeStruct(void)
{
    anker = NULL;
}

clTreeStruct::~clTreeStruct(void)
{
}

void clTreeStruct::AddItem(int zahl) // zahl ist unser Wert der in das neue Objekt reinkommt
{    
    
    if(anker == NULL) //Wenn noch keine Strukturen
    {
        
        anker = new baum;        // das neue Objekt wird erstellt, im HEAP!
        anker->inhalt = zahl;        // Inhalt wird gefüllt.
        anker->pnaechster = NULL;    // Nächster auf NULL, da anker 1 und letztes Element ist.
        anker->pvorgaenger = NULL; //Auf NULL da keinen Vorgänger
    }
    else                                
    {
        pWorker = anker;                   // "Arbeitszeiger" zeigt auf das erste Element!                                                                
        while (pWorker->pnaechster != NULL)//Solange bis zum letzten Element.
        {
            pWorker = pWorker->pnaechster; //pWorker kriegt das letzte Element, also NULL
        }
        pWorker->pnaechster = new baum;    // pnaecherster zeigt auf die neue Struktur.
        pWorker->pnaechster->pvorgaenger = pWorker;//pVorgaenger zeigt auf vorheriger Struktur.
        pWorker = pWorker->pnaechster;    // Arbeitszeiger auf neues Element.
        pWorker->inhalt=zahl;            // nun setzen wir den Wert unseres neuen Elements
                                        // (bekommen wir ja von unserer Funktion)
        pWorker->pnaechster = NULL;        // !!!! Wichtig !!!! hier lassen wir noch naechster
                                        // unseres neuen Elements auf NULL zeigen um es als
                                        // letztes Element zu auszuzeichen
    }
}
...



Dies habe ich als extra Klasse zu meinen Projekt hinzugefügt. Ich will also, das die Struktur der Liste während des ganzen Programms verfügbar ist. Wenn ich jetzt z.B. die Methode AddItem aufrufe:

C++:
clTreeStruct *objTree = NULL;
objTree = new clTreeStruct;
int iEingabe = GetDlgItemInt(IDC_EingabeFeld);
objTree->AddItem(iEingabe);
MessageBox("Knoten Eingefügt",MB_OK);


Und danach versuche von der View auf den Eingefügten Knoten zuzugreifen:

C++:
clTreeStruct objTree;
    int iB = objTree.GetBack();
    CString MeinCstring;
    MeinCstring.Format("%d\n", iB);
    MessageBox(MeinCstring,MB_OK);


Funktioniert das natürlich nicht, da ja ein neues Objekt der Klasse clTreeStruct erstellt wird, und somit der Pointer auf Nichts zeigt. Wie kann ich das jetzt anstellen, dass ich die Struktur (also die verkettete Liste) die ganze Zeit zur Verfügung habe also total Global zu verfüfung habe?

Viele Grüße eure Kati!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.10.2005, 18:34 Uhr
~Ankatrin
Gast


Ups, was vergessen (werd mich gleich erstmal registrieren damit ich eiditieren kann ).

Die Methode AddItem lasse ich das erstemal im Dialog clEingabeDiaolg aufrufen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.10.2005, 20:26 Uhr
ao

(Operator)


Hallo Ankatrin,
was du da aufbaust, ist kein Baum, sondern eine doppelt verkettete Liste.

Außerdem sollte die Liste im Destruktor abgebaut und die Elemente freigegeben werden, sonst ist das ein Speicherleck.

Und für eine global vorhandene Struktur setze eine Instanz von clTreeStruct als Member in eine geeignete Klasse. Z.B. die Dialogklasse.

Gruß,
ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.10.2005, 21:32 Uhr
Ankatrin83



Hi
Jap, ist ne Liste, will die noch zum Baum umbauen...

Kannst du das mit der der Instanz als Member genauer beschreiben. Wenn ich von clTreeStrct eine Instanz im Dialog machen, wird die Instanz ja gelöscht sobald ich den Dialog schliesse, somit sind die in der verketteten Liste vorhandenen Daten nicht mehr da Wo erstellt man die Instanz, damit sie z.B. solange eine View existiert, existiert.

MfG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.10.2005, 22:32 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von Ankatrin83:
Wo erstellt man die Instanz, damit sie z.B. solange eine View existiert, existiert.

MfG

In der View .
Vielleicht ist auch das Singleton Pattern für dich von Interesse,allerdings denke ich dass es mit ner Instanz deiner Klasse im Dokument oder der View getan ist.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.10.2005, 22:35 Uhr
ao

(Operator)


Ach so, der Dialog wird modal aufgerufen, und das TreeStruct soll in ihm gefüllt werden und ihn dann überleben. Wenn es logisch zur View gehört, sollte es auch dort liegen. Ungefähr so:

C++:
class CMyView
{
private:
    clTreeStruct m_tsTheTree;
};



Weiß nicht genau, ob das so geht, bin kein MFC-Experte.

Und dann müsstest du eine Referenz auf m_tsTheTree in die Dialogklasse reinkriegen und über diese Referenz das Objekt füllen, während der Dialog sichtbar ist.

Wenn dann der Dialog wieder zerlegt wird, bewirkt das Aufgeben der Referenz eben nicht die Zerstörung des Treestruct-Objekts.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: