Warum ist der Pointer nicht NULL?
-
Danke für deine Mühe!
Du sagst keinen Qualifizierer für z.B. int, char oder short. Also anscheinend für alle primitiven Datentypen. Zählt da auch std::string bzw. wxString dazu?Wenn dem so ist, würdest du in meinem Beispiel keine Referenzen und auch keine Pointer verwenden, korrekt?
Foo.h
#ifndef Foo_ #define Foo_ class Foo { private: wxString Test; public: void SetTest(wxString inTest) { Test = inTest; } public: wxString GetTest() { return Test; } }; #endif // Foo_EventHandler:
virtual void OnButton1Click(wxCommandEvent& event) { Foo Blau; Blau.SetTest("WessenBlau"); Button1->SetLabel(Blau.GetTest()); }
-
Zeichenketten sind keine primitiven Typen und hinzu kommt noch, dass man in der Regel nicht weiß, wie lang sie sind (der Kopieraufwand kann also beliebig groß werden). Daher würde ich Zeichenketten nie durch Kopie weitergeben, außer ich brauche aus irgendeinem Grund unbedingt eine Kopie.
-
Ok.
Foo.h
#ifndef Foo_ #define Foo_ class Foo { private: wxString Test; public: void SetTest(const wxString& inTest) { Test = inTest; } public: wxString GetTest() { return Test; } }; #endif // Foo_In Zeile 12 wird der Wert der Referenz in die Variable Test gespeichert, oder wird nur die Referenz irgendwie kopiert?
Wie benutze ich const bei GetTest? const wxString& macht hier ja keinen Sinn, da der Rückgabestring ja eh nicht verändert werden kann, die Membervariable aber schon. Wie verhindere ich das?
-
DarkBug schrieb:
In Zeile 12 wird der Wert der Referenz in die Variable Test gespeichert, oder wird nur die Referenz irgendwie kopiert?
Ersteres.
Wie benutze ich const bei GetTest? const wxString& macht hier ja keinen Sinn,
Doch!
da der Rückgabestring ja eh nicht verändert werden kann,
Häh? Warum nicht?die Membervariable aber schon. Wie verhindere ich das?
Siehe oben. Außerdem sollte die ganze Methode gleich mit const sein. Also:
const wxString& GetTest() const { return Test; }(Disclaimer: Alles unter der Voraussetzung, dass wxstring eine halbwegs "normale" Semantik hat. Bei diesen GUI-Frameworks weiß man ja nie…)
-
Das const nach der Methode heißt, das in dieser Methode keine Klassenvariablen verändert werden können, oder?
Während des return-Vorgangs kann die Variable doch nicht verändert werden. Nur vor dem return in der Methode und nachher vom Aufrufer der Methode.Also würde ein
wxString& GetTest() const { return Test; }doch reichen, oder?
-
Nein, denn dann könnte Test schließlich vom Aufrufer über die Referenz verändert werden. Irgendwie habe ich das Gefühl, du hast Referenzen noch überhaupt nicht verstanden.
-
Jetzt habe ich das soweit verstanden.
Das const rechts von einer Methode verhindert, das man in dieser Methode keine Membervariablen verändern kann, oder?
-
Ja. Es muss außerdem beachtet werden, dass innerhalb dieser Methode keine Methode aufgerufen werden darf, die nicht const-qualifiziert ist.
-
Gut. Ich habe meinen Code nun soweit angepasst. Ist das so nun korrekt?
Foo.h
#ifndef __Foo__ #define __Foo__ class Foo { private: wxString Test; public: void SetTest(const wxString& inTest) { Test = inTest; } public: const wxString& GetTest() const { return Test; } }; #endifApp.cpp
#ifdef WX_PRECOMP #include "wx_pch.h" #endif #ifdef __BORLANDC__ #pragma hdrstop #endif #include <wx/wx.h> #include "MainFrame.h" class App : public wxApp { public: virtual bool OnInit() { MainFrame* mfMainFrame = new MainFrame(0L); mfMainFrame->SetIcon(wxICON(MainIcon)); mfMainFrame->Show(); return true; } }; IMPLEMENT_APP(App);MainFrame.h
/////////////////////////////////////////////////////////////////////////// // C++ code generated with wxFormBuilder (version Sep 8 2010) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// #ifndef __MainFrame__ #define __MainFrame__ #include <wx/string.h> #include <wx/button.h> #include <wx/gdicmn.h> #include <wx/font.h> #include <wx/colour.h> #include <wx/settings.h> #include <wx/sizer.h> #include <wx/frame.h> #include "Foo.h" /////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// /// Class MainFrame /////////////////////////////////////////////////////////////////////////////// class MainFrame : public wxFrame { private: protected: wxButton* Button1; virtual void OnButton1Click(wxCommandEvent& event) { Foo Blau; wxString Eins = "Eins"; wxString Zwei = ""; Blau.SetTest(Eins); Zwei = Blau.GetTest(); Button1->SetLabel(Zwei); } public: MainFrame(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = wxEmptyString, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(500,300), long style = wxDEFAULT_FRAME_STYLE|wxTAB_TRAVERSAL); ~MainFrame(); }; #endif //__MainFrame__MainFrame.cpp
/////////////////////////////////////////////////////////////////////////// // C++ code generated with wxFormBuilder (version Sep 8 2010) // http://www.wxformbuilder.org/ // // PLEASE DO "NOT" EDIT THIS FILE! /////////////////////////////////////////////////////////////////////////// #include "MainFrame.h" /////////////////////////////////////////////////////////////////////////// MainFrame::MainFrame( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : wxFrame( parent, id, title, pos, size, style ) { this->SetSizeHints( wxDefaultSize, wxDefaultSize ); wxBoxSizer* BoxSizer1; BoxSizer1 = new wxBoxSizer( wxVERTICAL ); Button1 = new wxButton( this, wxID_ANY, wxT("MyButton"), wxDefaultPosition, wxDefaultSize, 0 ); BoxSizer1->Add( Button1, 0, wxALL, 5 ); this->SetSizer( BoxSizer1 ); this->Layout(); this->Centre( wxBOTH ); // Connect Events Button1->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::OnButton1Click ), NULL, this ); } MainFrame::~MainFrame() { // Disconnect Events Button1->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( MainFrame::OnButton1Click ), NULL, this ); }
-
*push*
-
Dein Foo.h sieht, bis auf den reservierten Bezeichner "__Foo__", gut aus.