Pointer initialisierung in Memberfunktion, dannach Zugriff in andrer Funktion/Konstruktor -> Segmention Fault
-
Hallo, ich hab wieder ein Problem mit Zeigern. Um den Quellcode übersichtlicher zu gestalten hab ich ihn so umgestaltet das mein Objekt in einer Memberfunktion meiner Klasse erzeugt wird. Nun dieses Objekt wird dort auch erzeugt, allerdings kann ich über diesen Pointer nun nicht mehr auf das Objekt zugreifen.
Der Code der Funktionierte (Im Konstruktor meiner Klasse):
//Konstruktor Code Ausschnitt wxBoxSizer *hbox= new wxBoxSizer(wxHORIZONTAL); hbox->Add(new wxStaticText (this,wxID_ANY,wxT("Bild"),wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT | wxST_NO_AUTORESIZE),2,wxEXPAND | wxALL,ABSTAND); textPfad=new wxTextCtrl(this,wxID_ANY,wxT(""), wxDefaultPosition, wxDefaultSize, 0,wxTextValidator(wxFILTER_NONE,&PfadBild)); hbox->Add(textPfad,5,wxEXPAND | wxALL,ABSTAND); hbox->Add(new wxPanel(this),1,wxEXPAND | wxALL,ABSTAND); vbox->Add(hbox,2,wxEXPAND | wxALL,ABSTAND); textPfad->Disable(); // <--- auf das Objekt kommts mir an
Der neue Code der mir Sorgen bereitet:
//Konstruktor Code Ausschnitt vbox->Add(erstelleZeile(wxT("Bild"),textPfad,PfadBild),2,wxEXPAND | wxALL,ABSTAND); textPfad->Disable(); // <--- auf das Objekt kommts mir an //Funktion wxBoxSizer * Klasse::erstelleZeile(wxString bez,wxTextCtrl *ctrl,wxString& str,long style) { wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL); hbox->Add(new wxStaticText (this,wxID_ANY,bez,wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT | wxST_NO_AUTORESIZE),2,wxEXPAND | wxALL,ABSTAND); ctrl=new wxTextCtrl(this,wxID_ANY,wxT(""), wxDefaultPosition, wxDefaultSize, 0,wxTextValidator(style,&str)); hbox->Add(ctrl,5,wxEXPAND | wxALL,ABSTAND); hbox->Add(new wxPanel(this),1,wxEXPAND | wxALL,ABSTAND); return hbox; }
Gut, ich hab mir soweit natürlich auch erstmal meine Gedanken gemacht, und mir ist jetzt die Idee gekommen das ich über den Funktionsaufruf evtl nicht die Adresse des Pointers sondern das worauf er zeigt, was in diesem Fall undefiniert sein dürfte kopiere? Wie kann ich nun die Funktionalität erreichen die ich mir erhoffe (Doppelpointer?)?
Edit: meine Funktion hat nen Prototypen wo style mit einem Defaultwert definiert wird.
Edit2: Eine Referenz auf einen Pointer kann man leider nicht erstellen
-
Gut ich hab nun nen Lösung gefunden, also sry
das ich hier das Board so vollspame, als ich vorhin geschrieben habe ist mir nach einiger Zeit erst eine Idee zugeflogen die ich dann mit notiert habe, die Verbesserung sieht so aus
//Konstruktor vbox->Add(erstelleZeile(wxT("Bild"),&textPfad,PfadBild),2,wxEXPAND | wxALL,ABSTAND); //Funktion wxBoxSizer * Klasse::erstelleZeile(wxString bez,wxTextCtrl **ctrl,wxString& str,long style) { wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL); hbox->Add(new wxStaticText (this,wxID_ANY,bez,wxDefaultPosition,wxDefaultSize,wxALIGN_RIGHT | wxST_NO_AUTORESIZE),2,wxEXPAND | wxALL,ABSTAND); *ctrl=new wxTextCtrl(this,wxID_ANY,wxT(""), wxDefaultPosition, wxDefaultSize, 0,wxTextValidator(style,&str)); hbox->Add(*ctrl,5,wxEXPAND | wxALL,ABSTAND); hbox->Add(new wxPanel(this),1,wxEXPAND | wxALL,ABSTAND); return hbox; }
-
die_rübe schrieb:
...
Das was du an Codeausschnitten Preis gibst lässt sehr viel Interpretationsraum.
1. ist das Objekt textPfad ein lokales Objekt, oder ein Klassenmember?
2. in deiner Methode (Funktion verwende ich nur bei freien Funktionen um den Unterschied zwischen Funktionen von Klassen [Methoden] und freien Funktionen zu verdeutlichen) she ich keine Verwendung des Objektes. Ist dies ein Member der Klasse, von dem die Methode ist?cu André
P.S: Es lohnt sich IMMER zumindestens den Funktions/Methodenkopf sowie den Punkt wo die Variable deklariert wird zu zeigen. Raten hilft wenig...
-
Ich wollte natürlich nicht gleich die gesamte Klasse posten, das wär etwas viel geworden, allerdings habe ich dabei wohl ein paar wichtige Informationen unterschlagen.
zu 1.
ist in der Klasse als protected Member deklariertwxTextCtrl *textPfad;
zu 2. Du hast recht das sollte Methode heißen und gehört zur selben Klasse wie der Konstruktor, diese initialisiert unter anderem ein an ihr übergebenes wxTextCtrl und das geht wie ich nun herausgefunden habe nur über den Doppelpointer
der Prototyp ebenfalls Protected:
wxBoxSizer * erstelleZeile(wxString bez,wxTextCtrl **ctrl,wxString& str,long style=wxFILTER_NONE);